《剑指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();
	}
posted @ 2023-08-17 15:28  YaosGHC  阅读(19)  评论(0)    收藏  举报