[Leetcode] 好题分享 946.验证栈序列

标题:[Leetcode] 好题分享 946.验证栈序列

个人主页:@水墨不写bug

(图片来源于网络)

 
 
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG     永不修改                      //
 
 

目录

栈简介

栈的基本操作

题目解析 

思路:

参考代码:


 正文开始:


        在学习栈这个数据结构的时候,你一定知道栈的特性:

栈简介

        栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。在这种数据结构中,新添加的或待删除的元素都保存在栈的同一端,称为栈顶(Top),另一端就称为栈底(Bottom)。栈的操作主要限制在栈顶进行,即栈的插入(push)和删除(pop)操作都只能在栈顶进行。

栈的基本操作

  1. push(): 向栈顶添加一个元素。如果栈已满,则可能导致溢出(overflow)。
  2. pop(): 移除栈顶的元素,并返回该元素。如果栈为空,则可能导致下溢(underflow)错误。
  3. top(): 返回栈顶元素的值,但不从栈中移除它。如果栈为空,则可能返回特殊值(如null或undefined)或抛出异常。
  4. isEmpty(): 检查栈是否为空。
  5. size(): 返回栈中的元素数量。

题目解析 

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

示例 1:

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

示例 2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • popped 是 pushed 的一个排列

思路:

        本题虽然比较简单,但是重要的是要思路清晰,如果觉得单靠思考难以解决,需要用到画图的时候一定要动手。

具体操作如下:

        既然是判断栈的入栈和出栈顺序,我们就借助“栈”来模拟即可:

        1.遍历入栈序列,让元素一直入栈;

        2.压栈的同时,需要判断什么时候需要出栈即可:

                当压入栈序列中即将压入栈的元素与栈顶元素比较,如果即将入栈的元素和栈顶元素相等,则pop栈顶元素。如果不相等,则将入栈元素压入栈中即可。

参考代码:

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> st;

        int i = 0;
        for(const auto& e :pushed)
        {
            st.push(e);
            while(i < popped.size() && !st.empty() && st.top() == popped[i])
            {
                st.pop();
                i++;
            }
        }
        if(!st.empty())
        {
            return false;
        }
        else
        {
            return true;
        }
    }
};

 完~

未经作者同意禁止转载

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水墨不写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值