【题目】
编写一个类,用两个栈实现队列,支持队列的基本操作(push、pop)。
【解答】
栈的特点是先进后出,而队列的特点是先进先出。我们用两个栈正好能把顺序反过来实现类似队列的操作。
具体实现时是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush;另外一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
因为数据压入栈的时候,顺序是先进后出的。那么只要把stackPush的数据在压入stackPop中,顺序就变回来了。但必须要做到以下两点:
(1)如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中的数据全部压入。
(2)如果stackPop不为空,stackPush绝对不能向stackPop中压入数据。
【代码实现】
#include<stack>
class TwoStacksQueue
{
private:
std::stack<int> stackPush;
std::stack<int> stackPop;
// push栈向pop栈倒入数据
void pushToPop(){
if (stackPop.empty()){
while (!stackPush.empty()){
stackPop.push(stackPush.top());
stackPush.pop();
}
}
}
public:
virtual void push(int pushInt){
stackPush.push(pushInt);
pushToPop();
}
virtual int pop(){
if (stackPush.empty() && stackPop.empty()){
// 抛出异常
}
stackPop.pop();
return stackPop.top();
}
};
【来源】
《程序员代码面试指南(IT名企算法与数据结构题目最优解)》左程云