1、思路
-
新增一个
pushToNew
方法,当stkNew
为空时,将stkOld
的元素全都push
到stkNew
中; -
每次
push
元素,都尝试pushToNew
,每次pop
元素,也要尝试pushToNew
,让stkNew
中保持按序存放队首元素,即从stkNew
栈顶弹出的每个元素都是当前队首元素; -
注意判空时只需要判断
stkNew
中是否有值即可,若队列不为空,stkNew
也一定不为空; -
push
与pop
的代码比起传统方式要简洁许多,不再需要两个栈的元素倒来倒去。
2、代码
class MyQueue {
private:
stack<int> stkOld, stkNew;
public:
MyQueue() {
}
void pushToNew()
{
if (stkNew.empty())
{
while (!stkOld.empty())
{
stkNew.push(stkOld.top());
stkOld.pop();
}
}
}
void push(int x) {
stkOld.push(x);
pushToNew();
}
int pop() {
int res = stkNew.top();
stkNew.pop();
pushToNew();
return res;
}
int peek() {
return stkNew.top(); //队首元素就是stkNew的栈顶元素
}
bool empty() {
return stkNew.empty(); //只需要判断stkNew
}
};