11.3Implement Queue using Stacks栈和队列
题目描述
用栈来实现队列。
输入输出样例
数据结构调用样例:
cpp
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false
题解
用两个栈来实现一个队列,达到先入先出的结果,所以必定要通过一个额外栈来翻转一次数组,这样让翻转过程既可以在插入时完成,也可以在取值时完成
cpp
#include <iostream>
#include <stack>
using namespace std;
class MyQueue {
stack<int> in, out;
public:
MyQueue() {}
void push(int x) {
in.push(x);
}
int pop() {
in2out();
if (out.empty()) return -1; // 防御性编程:防止空队列弹出
int x = out.top();
out.pop();
return x;
}
int peek() {
in2out();
if (out.empty()) return -1; // 防御性编程
return out.top();
}
void in2out() {
if (out.empty()) {
while (!in.empty()) {
int x = in.top();
in.pop();
out.push(x);
}
}
}
bool empty() {
return in.empty() && out.empty();
}
};
int main() {
MyQueue queue;
queue.push(1);
queue.push(2);
cout << "peek: " << queue.peek() << endl; // 应输出 1
cout << "pop: " << queue.pop() << endl; // 应输出 1
cout << "empty: " << (queue.empty() ? "false" : "true") << endl; // 应输出 false (因为还剩一个2)
return 0;
}