本题先前在复习王道时碰到过,当时因为写伪代码,只是想让两个栈来回倒,没有考虑其他问题;这次在做题时直接写系统提示我栈调用次数太多,段错误了。错误代码如下:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int head;
while(stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
head = stack2.top;
stack2.pop();
while(stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
return head;
}
}
private:
stack<int> stack1;
stack<int> stack2;
};
在参考别人处理该问题的方法后,我发现我没思考到的问题在于:
1.stack2如果非空则其pop出的数字序列仍为相应队列pop操作应有的部分序列,无需每pop一次就重置一次stack2
2.在stack2空,stack1往stack2输送数字时,无需再将数值保存回stack1,stack2就是队列序列的储存体,stack1只是中转站。
下面为正确代码:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int head;
if (stack1.empty() && stack2.empty()) return -1;
//以s1和s2均空表示队列空
if (!stack2.empty()){
head = stack2.top();
stack2.pop();
}
//s2非空则从s2中pop
else{
while (stack1.size() > 0){
stack2.push(stack1.top());
stack1.pop();
}
head = stack2.top();
stack2.pop();
}
//s2空,s1非空则说明上一段队列序列已清空,需要重新往s2输送队列序列
//注意,伴随着s2数字的装填,中转站s1也要逐步清空
return head;
}
private:
stack<int> stack1;
stack<int> stack2;
};