2、AB2 栈的压入、弹出序列
对应题目链接:算法入门-AB2
题目叙述:
2.1、解题思路
根据题目描述可知两个整数序列已经给出,让我们判断第二个序列能否是第一个序列的弹出顺序,因此当然要采用辅助栈来解题。
比较序列一定涉及到了遍历,而且序列长度已知,采用for 循环来逐个与第二个序列比较,一旦栈顶元素与其不等,那么一定不是弹出顺序。
接下来就是对入栈与出栈的设计:
第一个序列入栈前逐个与第二个序列的值进行对比,若不相等一直让第一个序列入栈,相等的话就可以让第二个序列向后走,重复操作直到出现不相等或者第二个序列遍历结束。
相等或者不相等都会让第一个序列入栈,区别是相等时入栈后就要出栈,让后第二个序列向后走,这点可以在代码中体现。
2.2、代码实现与解释
本题源码:
class Solution { public: bool IsPopOrder(vector<int> pushV, vector<int> popV) { int n = pushV.size(); //辅助栈 stack<int>s; //入栈下标 j int j = 0; //遍历出栈数组 for (int i = 0; i < n; i++) { //入栈:栈为空或者栈顶不等于出栈数组 while (j < n && (s.empty() || s.top() != popV[i])) { //使用 j++既入栈又能递增 s.push(pushV[j++]); } //栈顶等于出栈数组就取栈顶,继续比较 if (s.top() == popV[i]) s.pop(); //如果栈顶不匹配说明不匹配 else return false; } return true; } };
重要代码注释:
for 循环中下标i主要是为了控制第二个序列对应位置的值,while循环的条件比较多,j<n是防止第一个序列越界,与之并列的是为了防止栈空或者是当前已匹配栈顶元素被新元素取代。
剩下的大家可以将数据带入代码,感受这个压栈与弹出的逻辑
这个题解用到了vector与stack容器的基本操作,如果看起来困难可以先翻阅我的相关文章
这两道有关栈的算法题解分享到此结束,希望能给大家带来帮助,同时希望大家可以去挑战一下,题目链接已经放在文章里了