刷题笔记:栈的压入、弹出序列(C++)

前言:

  1. 发现每一题都更新实在太浪费时间,从现在开始只更新自己不会的或者比较麻烦的。
  2. 本人所有代码均由C++语言完成完成

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:

借用一个辅助的栈,遍历压栈顺序,先将第一个放入栈中,例子中是1,然后判断是不是出栈顺序的第一个元素,例子中为4,显然不相同,所以继续压栈,直到相等以后出栈,出栈一个元素,则将出栈顺序向后移动一位,知道不相等,如果辅助栈不为空,说明不是弹出顺序。

压栈顺序{1,2,3,4,5} 弹出序列为{4,5,3,2,1}
步骤 操作 弹出数字
1 压入1 1  
2 压入2 1,2  
3 压入3 1,2,3  
4 压入4 1,2,3,4  
5 弹出 1,2,3 4
6 压入5 1,2,3,5  
7 弹出 1,2,3 5
8 弹出 1,2 3
9 弹出 1 2
10 弹出 empty 1
压栈顺序{1,2,3,4,5} 弹出序列为{4,3,5,1,2}
步骤 操作 弹出数字
1 压入1 1  
2 压入2 1,2  
3 压入3 1,2,3  
4 压入4 1,2,3,4  
5 弹出 1,2,3 4
6 弹出 1,2 3
7 压入5 1,2,5  
8 弹出 1,2 5
9 此时应该弹出1,但是栈顶元素为2,操作终止。false

代码段:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size()==0)
            return false;
        int i=0;    //压入个数
        int j=0;    //弹出顺序
        for(;i<pushV.size();i++){
            //压入栈
            Data.push(pushV[i]);
            
            //若弹出序列的第j个等于栈顶
            while(j<popV.size() && popV[j]==Data.top()){
                Data.pop();
                j++;//弹出下一个
            }
        }
        if(Data.empty())
            return true;
        else
            return false;
    }
private:
    stack<int> Data;    //辅助栈
};
发布了22 篇原创文章 · 获赞 0 · 访问量 596

猜你喜欢

转载自blog.csdn.net/SampsonTse/article/details/103806412