ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法tip:栈的可生成性问题

2021-04-23 21:02:58  阅读:212  来源: 互联网

标签:popped 出栈 入栈 temp tip 生成 pushed 算法 size


算法tip:栈的可生成性问题

问题描述

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,判断它们是否可以在最初空栈上进行推入 push 和弹出 pop 操作。(LeetCode 946)

示例:
pushed = [1,2,3,4,5],
popped = [4,5,3,2,1]——>true

pushed = [1,2,3,4,5],
popped = [4,3,5,1,2]——>false

前提

首先,我们知道:

  1. 一个数出栈时,在它之前的数一定已经入栈(或入栈后被弹出)。
  2. 一个数x入栈时,在它之前入栈的y没有在x入栈前弹出,则必须在x出栈后才能弹出。

思路

由这两点我们可得:
(假设pushed是正序的)如果操作可以实现,则在popped中不可能出现这种情况:

设a<b<c,popped中出现...c,a,b...这种序列。(c出栈则说明a,b已经入栈(前提1),a没有在c出栈之前弹出,即a没有在b入栈之前弹出,则a必须在b出栈后弹出(前提2),所以popped中b一定在a之前,因此不可能出现c,a,b)

所以,只需判断popped中不出现c,a,b结构(c,a,b之间可以有其他数)则操作可实现。

但是,由于判断序列过于复杂,所需时间过多,远达不到我们的要求,因此上述思路

只适用于人眼判断,不适用于程序

下面给出程序判断方式。

解题程序

bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
         stack<int>temp;
    int j = 0;
    for (auto i = 0; i < pushed.size();) {
        temp.push(pushed[i]);
        ++i;
        while (temp.size()!=0&&temp.top() == popped[j]) {
            temp.pop();
            ++j;
        }//循环判断当栈顶元素与popped想要出栈元素一致时出栈。
    }
    if (temp.size() == 0) {
        return true;
    }
    return false;
    }

解题思路

直接模拟题目的入栈出栈过程,循环入栈,在其间如果top与出栈序列中现在想要出栈的元素相同则出栈。如果操作能执行,则执行到最后栈为空。因为只有一次循环入栈所以时间复杂度为O(N),因为只用了一个栈存放元素,所以空间复杂度为O(N)。

标签:popped,出栈,入栈,temp,tip,生成,pushed,算法,size
来源: https://www.cnblogs.com/lda-ovo/p/14695500.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有