《剑指Offer》-31-栈的压入、弹出序列
经典的选择题,但是这里要求用代码实现
我们可以根据 pop 结果去模拟这个过程,如果能够拟合,就是 true
什么情况下拟合成功?
两个指针都指向了数组末尾,同时栈空
太复杂了,条件能否简化一点?
什么时候拟合失败?
pushed 指针指向末尾全部压入栈中,但是poped 数组指针卡住了,不匹配导致弹栈弹不出去
pushed 数组指针指向末尾,同时栈空
尝试未果
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> stk;
int push = 0, pop = 0,len = pushed.size();
while (push <= len && pop<len) {
if (push!=0 &&!stk.empty() && stk.top() == popped[pop]) {
stk.pop();
pop++;
}
else {
stk.push(pushed[push]);
push++;
}
}
return stk.empty();
}
经 GPT 提示后 AC 代码如下
如果第一个 while 条件是小于,那么当 pushed 数组被全部压入栈中便会退出循环,此时栈和 pop 很有可能都不为空,也不确定结果是否匹配
然后在第二个 while 中,只要确认栈的出栈顺序和剩余的 pop 数组是否匹配就可以了
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> stk;
int push = 0, pop = 0, len = pushed.size();
while (push < len) {
if (!stk.empty() && stk.top() == popped[pop]) {
stk.pop();
pop++;
}
else {
stk.push(pushed[push]);
push++;
}
}
// 错误出在了这里,第一个循环退出有问题,再加一个while
while (!stk.empty() && stk.top() == popped[pop]) {
stk.pop();
pop++;
}
return stk.empty();
}