标题:[Leetcode] 好题分享 946.验证栈序列
个人主页:@水墨不写bug
(图片来源于网络)
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永无BUG 永不修改 //
目录
正文开始:
在学习栈这个数据结构的时候,你一定知道栈的特性:
栈简介
栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。在这种数据结构中,新添加的或待删除的元素都保存在栈的同一端,称为栈顶(Top),另一端就称为栈底(Bottom)。栈的操作主要限制在栈顶进行,即栈的插入(push)和删除(pop)操作都只能在栈顶进行。
栈的基本操作
- push(): 向栈顶添加一个元素。如果栈已满,则可能导致溢出(overflow)。
- pop(): 移除栈顶的元素,并返回该元素。如果栈为空,则可能导致下溢(underflow)错误。
- top(): 返回栈顶元素的值,但不从栈中移除它。如果栈为空,则可能返回特殊值(如null或undefined)或抛出异常。
- isEmpty(): 检查栈是否为空。
- size(): 返回栈中的元素数量。
题目解析
给定
pushed
和popped
两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回true
;否则,返回false
。示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 输出:false 解释:1 不能在 2 之前弹出。提示:
1 <= pushed.length <= 1000
0 <= pushed[i] <= 1000
pushed
的所有元素 互不相同popped.length == pushed.length
popped
是pushed
的一个排列
思路:
本题虽然比较简单,但是重要的是要思路清晰,如果觉得单靠思考难以解决,需要用到画图的时候一定要动手。
具体操作如下:
既然是判断栈的入栈和出栈顺序,我们就借助“栈”来模拟即可:
1.遍历入栈序列,让元素一直入栈;
2.压栈的同时,需要判断什么时候需要出栈即可:
当压入栈序列中即将压入栈的元素与栈顶元素比较,如果即将入栈的元素和栈顶元素相等,则pop栈顶元素。如果不相等,则将入栈元素压入栈中即可。
参考代码:
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int> st; int i = 0; for(const auto& e :pushed) { st.push(e); while(i < popped.size() && !st.empty() && st.top() == popped[i]) { st.pop(); i++; } } if(!st.empty()) { return false; } else { return true; } } };
完~
未经作者同意禁止转载