Implement Queue using Stacks
2015-09-17 22:36
232 查看
A queue can be implemented using two stacks. Let queue to be implemented be q and
stacks used to implement q be stack1 and stack2. q can be implemented in two ways:
Method 1 (By making enQueue operation costly)
This method makes sure that newly entered element is always at the top of stack
1, so that deQueue operation just pops from stack1. To put the element at top of stack1, stack2 is used.
enQueue(q, x)
1) While stack1 is not empty, push everything from satck1 to stack2.
2) Push x to stack1 (assuming size of stacks is unlimited).
3) Push everything back to stack1.
dnQueue(q)
1) If stack1 is empty then error
2) Pop an item from stack1 and return it
Method 2 (By making deQueue operation costly)
In this method, in en-queue operation, the new element is entered at the top of
stack1. In de-queue operation, if stack2 is empty then all the elements are moved to stack2 and finally top of stack2 is returned.
enQueue(q, x)
1) Push x to stack1 (assuming size of stacks is unlimited).
deQueue(q)
1) If both stacks are empty then error.
2) If stack2 is empty
While stack1 is not empty, push everything from satck1 to stack2.
3) Pop the element from stack2 and return it.
Method 2 is definitely better than method 1. Method 1 moves all the elements twice
in enQueue operation, while method 2 (in deQueue operation) moves the elements once and moves elements only if stack2 empty.
Implementation of method 2:
Run on IDE
Queue can also be implemented using one user stack and one Function
Call Stack.
Below is modified Method 2 where recursion (or Function Call Stack) is used to implement
queue using only one user defined stack.
enQueue(x)
1) Push
x
to
stack1.
deQueue:
1) If
stack1
is empty then error.
2) If
stack1
has only one element then return it.
3) Recursively pop everything from the stack1, store the popped item
in a variable
res,
push the res
back to stack1 and return res
The step 3 makes sure that the last popped item is always returned and since the
recursion stops when there is only one item in stack1
(step 2), we get the last element of stack1
in dequeue() and all other items are pushed back in step 3.
Implementation of method 2 using Function Call Stack:
stacks used to implement q be stack1 and stack2. q can be implemented in two ways:
Method 1 (By making enQueue operation costly)
This method makes sure that newly entered element is always at the top of stack
1, so that deQueue operation just pops from stack1. To put the element at top of stack1, stack2 is used.
enQueue(q, x)
1) While stack1 is not empty, push everything from satck1 to stack2.
2) Push x to stack1 (assuming size of stacks is unlimited).
3) Push everything back to stack1.
dnQueue(q)
1) If stack1 is empty then error
2) Pop an item from stack1 and return it
Method 2 (By making deQueue operation costly)
In this method, in en-queue operation, the new element is entered at the top of
stack1. In de-queue operation, if stack2 is empty then all the elements are moved to stack2 and finally top of stack2 is returned.
enQueue(q, x)
1) Push x to stack1 (assuming size of stacks is unlimited).
deQueue(q)
1) If both stacks are empty then error.
2) If stack2 is empty
While stack1 is not empty, push everything from satck1 to stack2.
3) Pop the element from stack2 and return it.
Method 2 is definitely better than method 1. Method 1 moves all the elements twice
in enQueue operation, while method 2 (in deQueue operation) moves the elements once and moves elements only if stack2 empty.
Implementation of method 2:
/* Program to implement a queue using two stacks */ #include<stdio.h> #include<stdlib.h> /* structure of a stack node */ struct sNode { int data; struct sNode *next; }; /* Function to push an item to stack*/ void push(struct sNode** top_ref, int new_data); /* Function to pop an item from stack*/ int pop(struct sNode** top_ref); /* structure of queue having two stacks */ struct queue { struct sNode *stack1; struct sNode *stack2; }; /* Function to enqueue an item to queue */ void enQueue(struct queue *q, int x) { push(&q->stack1, x); } /* Function to dequeue an item from queue */ int deQueue(struct queue *q) { int x; /* If both stacks are empty then error */ if(q->stack1 == NULL && q->stack2 == NULL) { printf("Q is empty"); getchar(); exit(0); } /* Move elements from satck1 to stack 2 only if stack2 is empty */ if(q->stack2 == NULL) { while(q->stack1 != NULL) { x = pop(&q->stack1); push(&q->stack2, x); } } x = pop(&q->stack2); return x; } /* Function to push an item to stack*/ void push(struct sNode** top_ref, int new_data) { /* allocate node */ struct sNode* new_node = (struct sNode*) malloc(sizeof(struct sNode)); if(new_node == NULL) { printf("Stack overflow \n"); getchar(); exit(0); } /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*top_ref); /* move the head to point to the new node */ (*top_ref) = new_node; } /* Function to pop an item from stack*/ int pop(struct sNode** top_ref) { int res; struct sNode *top; /*If stack is empty then error */ if(*top_ref == NULL) { printf("Stack overflow \n"); getchar(); exit(0); } else { top = *top_ref; res = top->data; *top_ref = top->next; free(top); return res; } } /* Driver function to test anove functions */ int main() { /* Create a queue with items 1 2 3*/ struct queue *q = (struct queue*)malloc(sizeof(struct queue)); q->stack1 = NULL; q->stack2 = NULL; enQueue(q, 1); enQueue(q, 2); enQueue(q, 3); /* Dequeue items */ printf("%d ", deQueue(q)); printf("%d ", deQueue(q)); printf("%d ", deQueue(q)); getchar(); } |
Queue can also be implemented using one user stack and one Function
Call Stack.
Below is modified Method 2 where recursion (or Function Call Stack) is used to implement
queue using only one user defined stack.
enQueue(x)
1) Push
x
to
stack1.
deQueue:
1) If
stack1
is empty then error.
2) If
stack1
has only one element then return it.
3) Recursively pop everything from the stack1, store the popped item
in a variable
res,
push the res
back to stack1 and return res
The step 3 makes sure that the last popped item is always returned and since the
recursion stops when there is only one item in stack1
(step 2), we get the last element of stack1
in dequeue() and all other items are pushed back in step 3.
Implementation of method 2 using Function Call Stack:
/* Program to implement a queue using one user defined stack and one Function Call Stack */ #include<stdio.h> #include<stdlib.h> /* structure of a stack node */ struct sNode { int data; struct sNode *next; }; /* structure of queue having two stacks */ struct queue { struct sNode *stack1; }; /* Function to push an item to stack*/ void push(struct sNode** top_ref, int new_data); /* Function to pop an item from stack*/ int pop(struct sNode** top_ref); /* Function to enqueue an item to queue */ void enQueue(struct queue *q, int x) { push(&q->stack1, x); } /* Function to dequeue an item from queue */ int deQueue(struct queue *q) { int x, res; /* If both stacks are empty then error */ if(q->stack1 == NULL) { printf("Q is empty"); getchar(); exit(0); } else if(q->stack1->next == NULL) { return pop(&q->stack1); } else { /* pop an item from the stack1 */ x = pop(&q->stack1); /* store the last dequeued item */ res = deQueue(q); /* push everything back to stack1 */ push(&q->stack1, x); return res; } } /* Function to push an item to stack*/ void push(struct sNode** top_ref, int new_data) { /* allocate node */ struct sNode* new_node = (struct sNode*) malloc(sizeof(struct sNode)); if(new_node == NULL) { printf("Stack overflow \n"); getchar(); exit(0); } /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*top_ref); /* move the head to point to the new node */ (*top_ref) = new_node; } /* Function to pop an item from stack*/ int pop(struct sNode** top_ref) { int res; struct sNode *top; /*If stack is empty then error */ if(*top_ref == NULL) { printf("Stack overflow \n"); getchar(); exit(0); } else { top = *top_ref; res = top->data; *top_ref = top->next; free(top); return res; } } /* Driver function to test above functions */ int main() { /* Create a queue with items 1 2 3*/ struct queue *q = (struct queue*)malloc(sizeof(struct queue)); q->stack1 = NULL; enQueue(q, 1); enQueue(q, 2); enQueue(q, 3); /* Dequeue items */ printf("%d ", deQueue(q)); printf("%d ", deQueue(q)); printf("%d ", deQueue(q)); getchar(); } |
相关文章推荐
- iOS中的UIToolBar
- U3D UGUI学习2 - RectTransform
- error: Autoconf version 2.67 or higher is required
- IOS 刷新UItableView 中的行或组详细介绍
- 第五讲:OpenGL坐标系和UIKit坐标系、锚点、addChild函数详解
- iOS -初识UIKit
- request.getAttribute和request.getParameter的区别
- UiAutomator 测试报告查看与分析
- 国际象棋模拟
- 【APUE】Chapter8 Process Control
- 类实现序列化时的serialVersionUID的作用
- UiAutomator 简单测试脚本示例
- easyui 动态修改窗口title
- iOS开发:自定义UITabBarController标签控制栏
- android关于Handler更新UI的用法
- UGUI Canvas 与 特效
- UI10_UIImageView
- UI09_协议控制
- iOS经典讲解之iOS8新特性UIAlertController
- Segue