0) 제목
Hackerrank 의 Queue 부분의 Queue using Two Stacks 문제입니다.
C언어를 이용하여 풀었습니다.
1) 문제설명
두개의 Stack을 가지고 Queue를 구현을 하는 문제입니다.
2) 풀이과정
두개의 Stack을 가지고 Queue를 구현을 하는 문제입니다.
동적할당으로 구현했습니다.
Queue에서 dequeue했을때,
Main Stack의 데이터들을 모두 pop 해서 Sub Stack에 push하는 방식으로 데이터 순서를 바꿨습니다.
그리고 나서 Sub Stack의 맨위 데이터를 pop 해서 dequeue를 구하고,
다시 Sub Stack에 있는 데이터를 모두 pop하고 Main Stack으로 push해서 데이터 순서를 돌렸습니다.
두개의 스택으로 구현하라고 하여서 제가 생각한 방법은 이 방법이었습니다.
더 좋은방법이 있을까요?
3) 코드
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 | #include <stdio.h> #include <stdlib.h> enum {ENQUEUE=1, DEQUEUE, PEEK}; typedef long long Data; typedef struct _stack{ Data * arr; int top; } Stack; //stack 초기화 void StackInit(Stack *ps, int q){ ps->arr = (Data *)malloc(sizeof(Data)*q); ps->top = -1; } //stack push void push(Stack * ps, Data data){ ps->arr[++(ps->top)] = data; } //stack pop Data pop(Stack * ps){ if(ps->top == -1) return -1; return ps->arr[(ps->top)--]; } //stack peek Data peekStack(Stack * ps){ if(ps->top == -1) return -1; return ps->arr[ps->top]; } //stack free void StackFree(Stack * ps){ free(ps->arr); } //main stack에 data를 push. void enqueue(Stack * ps, Data data){ push(ps, data); } //main stack에 있는 데이터 pop -> sub stack으로 push해서, //sub stack에서 pop을 한번한다. (dequeue 때문에) //그러고 나서 다시 sub stack의 데이터를 pop -> main stack 으로 push. Data dequeue(Stack * main, Stack * sub){ Data tmp, data; while(1){ tmp = pop(main); if(tmp==-1) break; push(sub, tmp); } data=pop(sub); while(1){ tmp = pop(sub); if(tmp == -1) break; push(main,tmp); } return data; } //main 스택의 첫번째 data return. Data peek(Stack * ps){ return ps->arr[0]; } int main(void){ int q, i, type; Data data; scanf("%d", &q); Stack stack, tmpStack; StackInit(&stack, q); StackInit(&tmpStack, q); for(i=0; i<q;i++){ scanf("%d", &type); switch(type){ case ENQUEUE: scanf("%lld", &data); enqueue(&stack, data); break; case DEQUEUE: dequeue(&stack, &tmpStack); break; case PEEK: printf("%lld\n",peek(&stack)); break; } } StackFree(&stack); StackFree(&tmpStack); return 0; } | cs |
경로 : Dashboard>Data Structures>Queue using Two Stacks
문제 출처 : [HackerRank] https://www.hackerrank.com/challenges/queue-using-two-stacks
'<알고리즘 문제풀이&연습> > [C++] 백준, 프로그래머스 등등' 카테고리의 다른 글
[C++ 동적할당] Variable Sized Arrays (배열) (0) | 2017.07.08 |
---|---|
[C 자료구조] Stack - Balanced Brackets (0) | 2017.07.07 |
[C 자료구조] Linked Lists -Reverse a doubly linked list (1) | 2017.07.06 |
[C 자료구조] Heap - QHEAP1 (0) | 2017.07.05 |
[C 자료구조] Tree - Level Order Traversal (0) | 2017.07.05 |
[C 자료구조] Linked Lists - Reverse a linked list (0) | 2017.07.04 |
[C 자료구조] Linked Lists - Inserting a Node Into a Sorted Doubly Linked List (0) | 2017.06.29 |
[C 자료구조] Stack - Maximum Element (0) | 2017.06.26 |