https://www.acmicpc.net/problem/18258
18258번: 큐 2
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net


난이도: solved.ac 실버 4
Linked List 복습 겸 Linked List를 이용해 큐(Queue)를 구현해 보았다
front, rear는 큐의 맨 앞, 맨 뒤를 가리키는 노드이다
front와 rear는 main 함수에서 둘 다 NULL이 되도록 초기화를 시켜준다
push 명령어는 어제 포스팅했던 스택 문제(10828번)를 풀 때처럼
push X(정수)를 push 따로, X 따로 입력받았다
https://jangkunstory.tistory.com/2
[백준] 10828번: 스택 (C언어)
https://www.acmicpc.net/problem/10828 스택을 구현하는 문제다 스택이란, 먼저 들어간 것이 나중에 나오는 후입선출(LIFO, Last In First Out) 방식의 자료구조이다 예를 들어, 1, 2, 3을 순서대로 넣고
jangkunstory.tistory.com
push를 할 때, 새로운 노드를 생성해 그 노드의 next는 NULL로 만들어주고
새로운 노드의 data에 입력받은 정수를 저장하는데
그러고 나서 그 노드를 rear로 만들어준다
pop을 할 때는 front가 가리키는 노드가 원래의 front의 next가 가리키는 노드를 가리키도록 해주는데
pop을 하면서 큐에 정수가 들어있지 않게 되면 front의 next는 NULL이 되게 된다
push를 할 때 새로운 노드의 next는 NULL을 가리키고 pop을 하면서 모든 노드가 빠져나가게 되면 front가 그 NULL을 가리키게 되기 때문이다
큐를 복습하는 목적으로 빠른 시일 내에 배열(array)을 이용하여 큐를 다시 구현하고 포스팅해보겠다
(코드)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define TRUE 1 #define FALSE 0 #define ERROR -1 /* Linked List */ typedef struct _node { int data; struct _node* next; } Node; /* Queue */ typedef struct _linkedQueue { Node* front; Node* rear; } Queue; int num; // Queue내 정수의 개수 void push(Queue*, int); int pop(Queue*); void size(Queue*); int empty(Queue*); int front(Queue*); int back(Queue*); int main() { int N, i, data; // data: push일 때 입력받는 수 char command[6]; // 입력 명령어를 담을 문자열 Queue q; /* Queue 초기화 */ q.front = NULL; q.rear == NULL; num = 0; scanf("%d", &N); for (i = 0; i < N; i++) { scanf("%s", command); if (!strcmp(command, "push")) { scanf("%d", &data); push(&q, data); } else if (!strcmp(command, "pop")) printf("%d\n", pop(&q)); else if (!strcmp(command, "size")) size(&q); else if (!strcmp(command, "empty")) printf("%d\n", empty(&q)); else if (!strcmp(command, "front")) printf("%d\n", front(&q)); else if (!strcmp(command, "back")) printf("%d\n", back(&q)); } return 0; } void push(Queue* pq, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 새로운 노드 생성 newNode->data = data; // 새로운 노드에 입력받은 수를 넣음 newNode->next = NULL; // 새로운 노드가 가리키는 다음 노드는 NULL if (pq->front == NULL) { // Queue가 비어있을 때 pq->front = newNode; pq->rear = newNode; } else { pq->rear->next = newNode; pq->rear = newNode; } num++; // Queue에 들어있는 정수의 개수 하나 증가 } int pop(Queue* pq) { if (pq->front == NULL) // Queue가 비어있을 때 return ERROR; else { Node* delNode; delNode = pq->front; int deldata = delNode->data; pq->front = pq->front->next; num--; // Queue에 들어있는 정수의 개수 하나 감소 free(delNode); // pop하는 Node의 메모리 해제 return deldata; } } void size(Queue* pq) { printf("%d\n", num); } int empty(Queue* pq) { if (pq->front == NULL) // Queue가 비어있을 때 return TRUE; else return FALSE; } int front(Queue* pq) { if (pq->front == NULL) // Queue가 비어있을 때 return ERROR; else { int front_data = pq->front->data; return front_data; } } int back(Queue* pq) { if (pq->front == NULL) // Queue가 비어있을 때 return ERROR; else { int back_data = pq->rear->data; return back_data; } }