剑指offer(C++)-JZ31:栈的压入、弹出序列(数据结构-队列 & 栈)

简介: 剑指offer(C++)-JZ31:栈的压入、弹出序列(数据结构-队列 & 栈)

题目描述:

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


1. 0<=pushV.length == popV.length <=1000


2. -1000<=pushV[i]<=1000


3. pushV 的所有数字均不相同

示例1:

输入:

[1,2,3,4,5],[4,5,3,2,1]


返回值:

true


说明:

可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()

这样的顺序得到[4,5,3,2,1]这个序列,返回true

示例2:

输入:

[1,2,3,4,5],[4,3,5,1,2]

返回值:


false

说明:


由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false

解题思路:

本题考察数据结构队列 & 栈的使用。


栈特性:先进后出。


1.尺寸判断,如果popV的尺寸大,那怎么都不可能复现弹出顺序。


2.定义一个辅助栈。


3.模拟入栈操作,当栈为空或者栈顶和popV的数值不一致时,就往里面放pushV的数据,直到栈顶一致。


4.模拟出栈操作,将栈顶与popV数值一致的数据弹出,进行下次循环;反之,返回false。


5.i表示弹出的次数,j表示入栈的数组尺寸。

测试代码:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        // 尺寸判断
        int pushsize = int(pushV.size());
        int popsize = int(popV.size());
        if(popsize > pushsize)
            return false;
        // 辅助栈
        stack<int> s;
        // 入栈下标
        int j = 0;
        for(int i = 0; i < popV.size() ; ++i)
        {
            // 入栈:栈为空或者栈顶不等于出栈数组
            while(j < pushsize  && (s.empty() || s.top() != popV[i]))
            {
                s.push(pushV[j]);
                j++;
            }
            // 栈顶等于出栈数组
            if(s.top() == popV[i])
                s.pop();
            // 不匹配
            else 
                return false;
        }
        return true;
    }
};


相关文章
|
3月前
|
安全 编译器 C语言
【C++数据结构】string的模拟实现
【C++数据结构】string的模拟实现
|
23天前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
36 7
|
23天前
|
消息中间件 存储 安全
|
1月前
|
算法 C++
|
1月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
3月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
61 1
|
4月前
|
存储 数据格式 运维
开发与运维C++问题之更改数据模型为通用数据结构如何解决
开发与运维C++问题之更改数据模型为通用数据结构如何解决
29 1
|
3月前
|
存储 设计模式 算法
【C++】deque以及优先级队列
【C++】deque以及优先级队列
|
4月前
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
64 0
|
4月前
|
存储 算法 C语言
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
【C++】详解STL的适配器容器之一:优先级队列 priority_queue