저번 시간에 만들었던 연결 리스트를 이용해 Stack과 Queue를 만들어보았다. 끝에서만 항목(item)을 삭제하거나 저장하는 자료구조인 LIFO의 Stack, 양 끝에서 삽입과 삭제가 각각 수행되는 자료구조인 FIFO의 Queue를 몇 가지 특징과 함께 정리해보았다. 나중에 다시 볼 수 있게 나만의 언어로 작성하는 글이라 읽기 불편할 수 있지만...
1. Stack
Stack의 주요 함수는 삽입을 담당하는 push와 삭제를 담당하는 pop이다.
기본적으로 자료구조의 끝에서만 삽입과 삭제가 일어나기 때문에 구현하는데에는 그리 어렵지 않았다.
push :: list와 KeyData를 입력받아 리스트의 끝에 연결해준다.
pop :: 리스트의 끝에 있는 항목을 날려준다.
print :: 리스트의 항목들을 보여준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <stdio.h> #include <conio.h> #include <stdlib.h> // size_MaxValue = 10; int size = 0; typedef struct stack { struct node *head; struct node *tail; }stack; typedef struct node { int key; struct node *next; }node; void push(stack *list, int keyData) { if (size < 10) { node *newNode = (node *)malloc(sizeof(node)); newNode->key = keyData; newNode->next = NULL; if (list->head == NULL && list->tail == NULL) { list->head = newNode; list->tail = newNode; } else { list->tail->next = newNode; list->tail = newNode; } size++; printf("Succeessfully pushed"); } else { printf("stack is full\n"); } } void pop(stack *list) { if (size > 0) { node *lastNode = list->head; if (size == 1) { list->head = NULL; list->tail = NULL; } else { for (int i = 0; i < size - 2; i++) { lastNode = lastNode->next; } lastNode->next = NULL; list->tail = lastNode; } size--; printf("Succeessfully popped"); } else { printf("stack is empty\n"); } } void print(stack *list) { if (list->head != NULL) { node *currentNode = list->head; printf("******\n"); while (1) { printf("%d\n", currentNode->key); if (currentNode == list->tail) break; currentNode = currentNode->next; } printf("******\n"); } else { printf("stack is empty\n"); } } int main(void) { int com, key; stack *list = (stack *)malloc(sizeof(stack)); list->head = NULL; list->tail = NULL; while (1) { printf("\nstack :: 1-push, 2-pop, 3-print // size is %d\n", size); scanf_s("%d", &com); switch (com) { case 1: scanf_s("%d", &key); push(list, key); break; case 2: pop(list); break; case 3: print(list); break; } } } | cs |
2. Queue
Queue의 주요 함수는 삽입을 담당하는 add와 삭제를 담당하는 remove이다.
Stack의 코드를 살짝 변형만 해주었다.
add :: 새 노드를 만들어 list의 끝에 KeyData를 삽입한다.
remove :: list의 Head를 삭제하고, 그 다음 노드를 Head로 지정해준다.
print :: 리스트의 항목들을 보여준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <stdio.h> #include <conio.h> #include <stdlib.h> // size_MaxValue = 10; int size = 0; typedef struct queue { struct node *head; struct node *tail; }queue; typedef struct node { int key; struct node *next; }node; void add(queue *list, int keyData) { if (size < 10) { node *newNode = (node *)malloc(sizeof(node)); newNode->key = keyData; newNode->next = NULL; if (list->head == NULL && list->tail == NULL) { list->head = newNode; list->tail = newNode; } else { list->tail->next = newNode; list->tail = newNode; } size++; printf("Succeessfully added"); } else { printf("queue is full\n"); } } void remove(queue *list) { if (size > 0) { node *lastNode = list->head; if (size == 1) { list->head = NULL; list->tail = NULL; } else { list->head = lastNode->next; } size--; printf("Succeessfully removed"); } else { printf("queue is empty\n"); } } void print(queue *list) { if (list->head != NULL) { node *currentNode = list->head; printf("******\n"); while (1) { printf("%d\n", currentNode->key); if (currentNode == list->tail) break; currentNode = currentNode->next; } printf("******\n"); } else { printf("queue is empty\n"); } } int main(void) { int com, key; queue *list = (queue *)malloc(sizeof(queue)); list->head = NULL; list->tail = NULL; while (1) { printf("\nqueue :: 1-add, 2-remove, 3-print // size is %d\n", size); scanf_s("%d", &com); switch (com) { case 1: scanf_s("%d", &key); add(list, key); break; case 2: remove(list); break; case 3: print(list); break; } } } | cs |
파이썬 배열로도 해버렸다
1. stack
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | def push(item): stack.append(item) def peek(): if len(stack) != 0: return stack[-1] def pop(): if len(stack) != 0: item = stack.pop(-1) return item stack = [] while(1): s = int(input('명령어를 입력하세요 ( 1-push / 2-pop / 3-print / 4-quit ) : ')) if s == 1: v = input('어떤 값을 push 할까요? : ') push(v) elif s == 2: if len(stack) == 0: print('stack 이 비어있습니다.') else: print('pop 되었습니다.') pop() elif s == 3: for i in stack: print(i) elif s == 4: break else: print('잘못 입력 하셨습니다.') | cs |
반응형
'이론 > 알고리즘' 카테고리의 다른 글
알고리즘 스터디 5회차 - 동적 계획법 (백준 2579번: 계단 오르기) (0) | 2018.06.05 |
---|---|
백준 2745번: 진법변환 (0) | 2018.05.31 |
알고리즘 스터디 4회차 - Linked List로 Heap Sort구현 (1) | 2018.03.25 |
알고리즘 스터디 3회차 - 이진트리(Binary Tree) 구현 (0) | 2018.03.09 |
알고리즘 스터디 1회차 - 연결리스트(Linked List) 구현 (0) | 2018.02.23 |
댓글