LeetCode-946. 验证栈序列

题目描述 验证栈序列

给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

示例

输入: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

解题思路

转自 https://www.cnblogs.com/alias-blog/p/5459536.html

借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

举例:

入栈1,2,3,4,5

出栈4,5,3,2,1

首先1入辅助栈,此时栈顶1≠4,继续入栈2

此时栈顶2≠4,继续入栈3

此时栈顶3≠4,继续入栈4

此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3

此时栈顶3≠5,继续入栈5

此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

….

依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

代码

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        bool res;
        stack<int> s;
        int i=0;
        int j=0;
        while(i<pushed.size()){
            s.push(pushed[i]);

            while(!s.empty() && s.top()== popped[j]){
                s.pop();
                j++;
            }
            i++;
        }

        return s.size()>0 ? 0:1;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 方法一:使用ActivityLifecycleCallbacks android 在从sdk14 开始为我们提供了...
    黄海佳阅读 19,325评论 0 9
  • 历史记载,和珅曾经给苏卿怜倾诉时说过这么一段话:“天下人都以为和某是靠巴结皇上,溜须拍马而得来今天的权位。其实此言...
    钟书不钟情阅读 4,336评论 0 1
  • 国庆返程票没有及时买,只抢到了一张7号晚上的坐票,大晚上提着大包小包赶火车也算是别样的体验。也许是单位任务没完成,...
    随风的心晴阅读 955评论 0 1
  • 故事发生在墨西哥的一个小镇上,小男孩米格生活在一个四世同堂的家庭,长辈慈祥、衣食无忧。做鞋这门手艺在他们家代代相传...
    X畅一骁阅读 2,615评论 0 0
  • 为的是内心世界的充实,而不是他人眼中的风光。 无为,为应读第四声,做是的目的不是为了自己的利益,而是顺道而行,依规...
    黄南森技术分享阅读 2,915评论 0 1