Implement the following operations of a stack using queues.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- empty() -- Return whether the stack is empty.
解题思路:
用队列实现栈的操作。包含输入、输出、取栈顶元素、推断栈是否为空。
我们知道,栈是先进后出的容器,队列是先进先出的容器。所以输入元素非常easy,可是输出元素不是输出队列的front,而是back元素。删掉back元素。此时我们能够将队列1中的非队尾元素存在另外一个队列2中,删掉之前队列的最后一个元素不另行存储即可。
此时队列2中有元素。是可运行的容器。队列1是空,备用容器,所以我们须要两个表示符,代表两个队列,表示此队列是否是当前可操作的容器。简单来讲,就是用两个队列的操作(push()。pop(),empty())来实现栈的各种操作。
完整可运行代码例如以下:
#include<iostream> #include<queue> using namespace std; queue<int> qu1; queue<int> qu2; bool qu1_use=1; bool qu2_use=0; void push(int x); void pop() ; int top() ; bool empty() ; void main() { push(1); push(2); push(3); push(4); int i=5; while(i) { if(!empty()) { cout<<top()<<endl; pop(); } i--; } } void push(int x) { if(qu1_use==1) { qu1.push(x); } else qu2.push(x); } void pop() { if(qu1.empty()&&qu2.empty()) exit(0); if(qu1_use==1&&!qu1.empty()) { while(qu1.size()>1) { qu2.push(qu1.front()); qu1.pop(); } qu1.pop(); qu1_use=0; qu2_use=1; return; } if(qu2_use==1&&!qu2.empty()) { while(qu2.size()>1) { qu1.push(qu2.front()); qu2.pop(); } qu2.pop(); qu1_use=1; qu2_use=0; return; } return; } int top() { if(qu1_use==1&&!qu1.empty()) { return qu1.back(); } if(qu2_use==1&&!qu2.empty()) { return qu2.back(); } //if(qu1.empty()&&qu2.empty()) exit(0); } bool empty() { if((qu1_use==1&&qu1.empty())||(qu2_use==1&&qu2.empty())) { cout<<"empty!"<<endl; return true; } else return false; }
运行上面代码得到结果为:
4
3
2
1
empty!