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

栈的压入、弹出序列

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

栈的压入、弹出序列:最直观的想法是,使用辅助栈。首先遍历入栈,并将当前入栈元素压入辅助栈,再判断是否辅助栈不为空并且辅助栈栈顶元素等于当前出栈元素,注意这里是while循环,如果是则弹出辅助栈栈顶元素并且将当前出栈元素右移,最后判断辅助栈是否为空,如果是则压入弹出序列匹配,反之则不匹配。

bool IsPopOrder(vector<int> pushV,vector<int> popV) 
{
    stack<int> st; //辅助栈
    int n=pushV.size(); //栈的大小
    int j=0; //遍历出栈
    for(int i=0;i<n;i++) //遍历入栈
    {
        st.push(pushV[i]); //压入元素
        while(!st.empty()&&st.top()==popV[j]) 
        //当辅助栈栈不为空并且辅助栈栈顶等于当前出栈元素
        {
            st.pop(); //弹出元素
            j++; //辅助栈移位
        }
     }
     return st.empty(); //如果栈为空则可以否则不行
}

优化:上述代码使用了辅助栈即使用了额外的辅助空间,那么可不可以将空间复杂度降为O(1)呢?当然可以!直接将入栈当作辅助栈!

bool IsPopOrder(vector<int> pushV,vector<int> popV) 
{
    int i=0,j=0; //i表示入栈作为辅助栈 j表示出栈
    int n=pushV.size(); //栈的大小
    for(int k=0;k<n;k++) //遍历入栈
    {
        pushV[i]=pushV[k]; //入栈压入辅助栈
        while(i>=0&&pushV[i]==popV[j]) //辅助栈不为空且当前辅助栈栈顶等于当前出栈元素
        {
            i=i-1; //出栈
            j=j+1; //下一个出栈元素
        }
        //i变成-1然后退出循环又加1变成0
        i=i+1; //否则继续压入辅助栈
     }
     return i==0; //直至减为0
}

#栈的压入、弹出序列#
剑指offer 文章被收录于专栏

剑指offer专栏主要分享剑指offer题解。

全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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