- 关键点:始终保持所有元素都在一个队列里面!!!
用两个队列实现一个栈的方法有很多,这里给出最佳实现。(即元素转移次数最少的)
- 入栈:如果q1不为空,则给q1入队,否则给q2入队,一定要始终保证所有的元素都在一个队里面。
- 出栈:将不为空的队列里面的元素,除了队列底部的元素,其他元素全部弹出到另一个队列,此时再将这个队列里剩下的那个元素出队列即可。
- 获取栈顶元素:由于所有元素都保存在一个队列里,因此那个队列不为空,就返回队尾元素即可。
- 获取栈大小:元素都保存在在一个队列里,直接返回两个队列的长度之和。
#include<iostream>
#include<queue>
using namespace std;
class StackByQueue
{
public:
StackByQueue()
{}
~StackByQueue()
{}
void push(int x)
{
// queue1非空, 压入queue1
if(!queue1.empty()) {
queue1.push(x);
}
else {
queue2.push(x);
}
}
void pop() {
if(!queue1.empty()){
while(queue1.size() > 1) {
queue2.push(queue1.front());
queue1.pop();
}
queue1.pop();
}
else if(!queue2.empty()){
while(queue2.size() > 1){
queue1.push(queue2.front());
queue2.pop();
}
queue2.pop();
}
}
int top()
{
if (!queue1.empty()) {
return queue1.back();
} else if (!queue2.empty()) {
return queue2.back();
} else {
exit(1); //异常退出
}
}
int size() {
return queue1.size() + queue2.size();
}
private:
queue<int> queue1;
queue<int> queue2;
};
int main() {
StackByQueue s1;
s1.push(1);
s1.push(2);
s1.push(3);
s1.push(4);
s1.push(5);
cout << s1.size() << endl;
cout << s1.top() << endl;
s1.push(6);
s1.pop();
cout << s1.size() << endl;
cout << s1.top() << endl;
s1.pop();
cout << s1.size() << endl;
cout << s1.top() << endl;
}
参考资料:
https://blog.51cto.com/11418774/1761549