一 问题描述:

     两个数组pPush和pPop分别存储了压栈序列和出栈序列,如何判断出栈序列是否正确,假设元素不重复。

     需要实现的函数:

  bool isStackOutRight(int *stackIn,int *stackOut,int length)

二 举例:

pPush中序列为:[5   9   1   8    13     4   2    7]

给出一个出栈序列pPop:[8   4    13   1   7   2  9   5],这个出栈序列是正确的。

给出另一个出栈序列pPop:[8   4    13   1   5   4   2     7    9],这个出栈序列就是错误的,因为8第一个出栈,说明栈中已经压入过5  9  1三个元素,它们还存在栈中

它们的出栈顺序必须满足 1  9  5 这个顺序(可以不连续,但是19前,95前),但是出栈队列中给出的顺序是1   5   9,所以是错误的。


三  算法思路:

需要用到一个辅助栈stackData来存储压入栈而尚未出栈的元素

现在举错误的出栈顺序为例:pPop:[8   4    13   1   5   4   2     7    9]

   

1  对出栈序列进行遍历,第1个元素是8,说明前面已经存过5  9  1,将它存入辅助栈中

在压入辅助栈的操作中,我们需要遍历压栈序列pPush:[5   9   1   8    13     4   2    7]

          (1)   [5   9   1   8    13     4   2    7]   index指向首元素5,不等于元素8 ,将5压入辅助栈

  (2)   [5   9   1   8    13     4   2    7]   index指向元素9不等于元素8 ,将9压入辅助栈

          (3)   [5   9   1   8    13     4   2    7]   index指向元素1不等于元素8 ,将1压入辅助栈

          (4)   [5   9   1   8    13     4   2    7]   index指向元素8等于元素8 ,相等时不压入,因为还要弹出

          (5)   [5   9   1   8    13     4   2    7]   index指向下一个元素,以便下次压入操作

           压栈结束后

           stackData:  1  9  5】        (“】”形象的表示栈开口方向向左,1是栈顶元素)  

           可以看出,压入辅助栈的关键是压栈序列中的元素是否等于目前的遍历元素(8),不等于压入,等于就不再压入

 2  遍历第2个元素是4,它不等于stackData中的top元素1,说明它可能(也可能存在于辅助栈)是新压入的元素,那么容易知道4之前的元素13已经被压入栈中,所以将13压入辅助栈

 stackData:   13  1  9  5】 

   index指向下一个元素2

             [5   9   1   8    13     4   2    7]

3  遍历第3个元素是13,它等于是stackData中的top元素13,说明没有新压入元素,只是弹出元素,所以辅助栈需要弹出top元素13

 stackData:  1  9  5】 

4  遍历第4个元素是1,它等于现在stackData中的top元素1,说明没有新压入元素,只是弹出元素,所以辅助栈需要弹出top元素1

 stackData:    9  5】 

5  遍历第5个元素是5,它不等于现在stackData中的top元素9,说明它可能是新压入的元素,也可能是辅助栈中的元素

    情况1:如果是新压入的元素,那么出栈顺序到现在为止还是正确的

情况2:如果是辅助栈中的元素(已经知道不是首元素),就可以知道出栈序列是错误的,因为如果是辅助栈中的元素,出栈顺序必须和辅助栈一致,也就是必须是先95

问题的关键是怎么判断这种情况是情况1还是情况2

可以这样做,将这种情况看做是情况1,那么需要继续向辅助栈中压入元素,但是会发现将压栈序列中全部元素都压入辅助栈后依然找不到一个元素等于当前遍历元素5

           在第2步后,index已经指向了2

  (1)   [5   9   1   8    13     4   2   7]   index指向元素2不等于元素5 ,将2压入辅助栈

          (2)   [5   9   1   8    13     4   2    7]   index指向元素7不等于元素5 ,将7压入辅助栈

           现在index已经指向了最后一个元素,但是没有找到等于5的元素,那么可以断言,5其实是在辅助栈中的,这种情况属于情况2,因此出栈序列是不正确的


四   伪代码

     int index = 0

 for 遍历出栈序列           

             if  (辅助栈不空 && 辅助栈top元素等于pPop[i])                  

                      辅助栈弹出top元素

             else    //辅助栈为空 或者 top元素不等于pPop[i],要压入元素了

                  while(pPush[index] 不等于 pPop[i] //只压入pPop[i]之前的元素,本身不压入

                         辅助栈压入pPush[index] 元素

                         index++

                   if (index 等于 length)//说明没有找到这个元素标记,pPop[i]一定在辅助栈中,出栈序列错误

                             return false

                   else

                             index++ //要指向下一个元素

       return  true  //for 循环能正常结束,出栈序列就一定是正确的


 五  代码

       1   C++版本

  

 1 bool isStackOutRight(int *stackIn,int *stackOut,int length){
 2       stack<int>  stackData;//辅助栈
 3       int index(0);
 4          for (int i = 0;i<length;i++){//遍历整个出栈序列
 5
 6              if (!stackData.empty() && stackData.top() == stackOut[i]) //辅助栈不空,而且遍历的元素是辅助栈的top元素,需要弹出操作
 7                      stackData.pop();
 8              else {  //辅助栈为空,或者不等于首元素,指向压栈操作
 9                  while(index<length && stackIn[index] != stackOut[i])
10                     stackData.push(stackIn[index++]);
11                 if (index == length)//这里是关键,说明在压栈序列中从index开始往后遍历,没有找到该元素,该出栈序列不正确
12                     return false;
13                 else
14                     index++;
15             }
16         }
17         return true;//整个for循环能正常结束(没有遇到return false),说明出栈序列正确
18  }


转载于:https://www.cnblogs.com/lovexfr/p/5422610.html

判断栈的出栈顺序是否正确相关推荐

  1. C++的STL 栈实现 判断栈的出栈顺序是否合理

    有这样的题目: 已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法? 类似如下: 已知栈的出栈序列为: ...

  2. 【LeetCode946】判断可能的出栈顺序

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

  3. 面试题之判断栈的入栈和出栈序列的合法性

    完整题目是这样的:给我们两个序列,第一个序列表示栈的压入顺序,然后让判断第二个序列是不是是否是该栈的弹出序列.现设第一个序列为[1,2,3,4,5],第二个序列为[3,2,5,4,1],可以看出这个出 ...

  4. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  5. 栈的入栈和出栈的顺序规律

    栈的入栈和出栈的顺序规律是先进后出,所以出栈的可能数目跟入栈的可能排列数目是一致的.a的出入有2中可能,b的出入有2种可能,c的出入有2种可能,d只需要关系入,只有一种可能.所以出栈方式数为2*2*2 ...

  6. 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )

    文章目录 一.不同类型矩阵变换先后顺序 二.渲染前不设置单位阵 三.矩阵的压栈和出栈原理分析 四.矩阵的压栈和出栈代码示例 五.相关资源 一.不同类型矩阵变换先后顺序 对 OpenGL 中的 模型视图 ...

  7. java顺序栈_顺序栈的基本操作(入栈和出栈)

    顺序栈的基本操作(入栈和出栈) 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序 ...

  8. c语言出栈入栈指针的管理,设计顺序栈有关入栈和出栈的操作算法

    问题描述: 设有两个栈s1.s2都釆用顺序栈方式,并且共享一个存储区[0, -, maxsize-1],为了尽量利用空间,减少溢出的可能,可釆用栈顶相向.迎面增长的存储方式.试设计s1.s2 有关入栈 ...

  9. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武

    本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...

  10. 顺序栈基本操作(入栈和出栈)C语言详解

    #include <stdio.h> #include <stdlib.h> /*顺序栈基本操作(入栈和出栈)C语言详解栈的具体实现(1)顺序栈(2)链栈栈的应用(1)回退 ( ...

最新文章

  1. 工业级路由器和家用路由器的区别_5G工业级路由器有哪些优势
  2. python lamda函数_python 用lambda函数替换for循环的方法
  3. winform Tab键循序 小发现
  4. php ajax取不到值,PHP没有从Ajax获取值
  5. Android 4 学习(20):ActionBar
  6. Tensorflow 循环神经网络03 LSTM长短时记忆神经网络
  7. Python中利用*打印不同的三角形
  8. edittext在哪可以获取有效值_java-从EditText获取文本字符串?
  9. 20171016课程随笔
  10. Foxit PDF SDK 下载地址
  11. 【Python实例第30讲】F检验与互信息
  12. 数据挖掘面试题之梯度提升树
  13. 基于麻雀搜索算法优化的SVM数据分类预测 - 附代码
  14. 22:紧急措施http://noi.openjudge.cn/ch0107/22/
  15. qlv转mp4出来没有画面,无画面,解决方法
  16. 微控制器编程技术c语言,8位单片机C语言编程:基于PIC16(用c语言对pic16微控制器进行编程的实用指导)...
  17. npm install 很慢、卡死怎么解决
  18. Layui官方js正则验证手机号,邮箱,网址,日期,身份证
  19. 笔记 ~ 第二章 - 2.2 关系操作、关系完整性、关系代数、关系演算
  20. 2020.01.27 再见24号

热门文章

  1. [转]WIN7服务一些优化方法
  2. 单片机的电池供电电路
  3. qt报错:In included file: expected member name or ‘;‘ after declaration specifiers
  4. Nginx目录结构、编译参数、状态码概述
  5. Crypto菜狗的学习日志之古典密码(一)
  6. 程序员的高考题又来了
  7. Vscode 打开终端窗口
  8. jieba分词(1):入门案例
  9. 光大银行手机客户端登录异常:您的网络环境不符合安全要求
  10. 更换kindle书籍的字体