题解 | #栈的压入、弹出序列#

栈的压入、弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106

class Solution {
  public:
    bool IsPopOrder(vector<int> pushV, vector<int> popV) {
        int len = pushV.size();
        stack<int> s;
        int j = 0;//表示进栈元素的个数
        for (int i = 0; i < len; i++) {
            while (j < len && (s.empty() || s.top() != popV[i])) {
			//刚刚初始化的s执行top()会报错,所以放在or后面,当s为空时不再执行后面的s.top()。
                s.push(pushV[j]);
                j++;//j永远不会减小
            }
		  //如果不满足while条件,说明:1.top==popV[i],代表有数据需要出栈;2.数据已经全部入栈。
		  //如果出栈元素和栈顶元素相同,则pop该元素;若两元素不同,则报错
            if (s.top() == popV[i]) {
                s.pop();
            } else {
                return false;
            }

        }
        return true;//最后没有报错,则返回true
    }
};

这道题目其实就是模拟进栈和出栈的过程,然后再这个过程当中判断pop是否合法。

我们需要不断的push数据,指导popV中的第一个元素,然后我们判断栈s中的元素与popV的第一个元素是否相同(第一个肯定相同),相同则pop该元素;

接着继续判断是否需要进栈,判断的方法在于s的top元素与popV中第二个元素相等,如果不相等,代表需要进栈;直到全部元素入栈完成或者中途出现错误。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务