728x90
[백준알고리즘] 10866번: 덱 -C
https://www.acmicpc.net/problem/10866
이번 문제는 덱을 직접 구현하는 문제이다.
그래서 문제를 보기 전에는 그냥 파이썬이나 자바로 풀 생각을 해봤는데 오랜만에 링크드 리스트를 만들어 볼 겸 C로 작성을 했다.
일단 링크드리스트를 만들기 위해서 구조체를 만들어 주어야 한다.
구조체 멤버로 data와 링크를 걸 노드들을 가리킬 next, previous가 있어야 한다.
구조체를 구현해주고 나면 doubly linked list를 구현해주면 된다.
그리고 들어오는 입력에 따라 적절한 처리를 해주면 될 뿐이다.
사실 설명할 건 없고 오랜만에 링크드 리스트 직접 구현해 볼 겸 해본 문제이다.
함수들을 따로 만들까 하다가 그냥 한 번에 넣어 만들었더니 코드가 너무 길어졌다..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct s_node {
int data;
struct s_node *before;
struct s_node *after;
}node;
int main(void) {
int N, i, cnt, data;
char command[10];
node *first, *last;
first = (node *)malloc(sizeof(node));
last = (node *)malloc(sizeof(node));
first = NULL;
last = NULL;
scanf("%d", &N);
for (i = 0; i < N; i++) {
scanf("%s", command);
if ( !strcmp(command, "push_front")) {
node *new_data;
new_data = (node *)malloc(sizeof(node));
scanf("%d", &data);
new_data->data = data;
new_data->after = NULL;
new_data->before = NULL;
if (first == NULL || last == NULL) {
first = new_data;
last = new_data;
}
else {
new_data->after = first;
first->before = new_data;
first = new_data;
}
}
else if ( !strcmp(command, "push_back")) {
node *new_data;
new_data = (node *)malloc(sizeof(node));
scanf("%d", &data);
new_data->data = data;
new_data->after = NULL;
new_data->before = NULL;
if (first == NULL || last == NULL) {
last = new_data;
first = new_data;
}
else {
new_data->before = last;
last->after = new_data;
last = new_data;
}
}
else if ( !strcmp(command, "pop_front")) {
if (first == NULL || last == NULL) printf("-1\n");
else {
node *t_data = first;
printf("%d\n", t_data->data);
first = t_data->after;
free(t_data);
if(first == NULL) last = NULL;
else first->before = NULL;
}
}
else if ( !strcmp(command, "pop_back")) {
if (first == NULL || last == NULL) printf("-1\n");
else {
node *t_data = last;
printf("%d\n", t_data->data);
last = t_data->before;
free(t_data);
if(last == NULL) first = NULL;
else last->after = NULL;
}
}
else if ( !strcmp(command, "size")) {
node *t_data = first;
cnt = 0;
while(first != NULL && last != NULL && t_data != NULL){
t_data = t_data->after;
cnt++;
}
printf("%d\n", cnt);
}
else if ( !strcmp(command, "empty")) {
if(first == NULL || last == NULL) printf("1\n");
else printf("0\n");
}
else if ( !strcmp(command, "front")) {
if(first == NULL) printf("-1\n");
else printf("%d\n", first->data);
}
else if ( !strcmp(command, "back")) {
if(last == NULL) printf("-1\n");
else printf("%d\n", last->data);
}
}
return 0;
}
잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다
728x90
'algorithm > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘] 5430번: AC -Python (0) | 2019.09.16 |
---|---|
[백준알고리즘] 1021번: 회전하는 큐 -Python (0) | 2019.09.13 |
[백준알고리즘] 1966번: 프린터 큐 -Python (0) | 2019.09.10 |
[백준알고리즘] 11866번: 조세퍼스 문제 0 -Java (0) | 2019.09.09 |
[백준알고리즘] 2164번: 카드2 -Python (0) | 2019.09.07 |