C++:检查出栈顺序的合法性

CheckSequence.cpp

#include<iostream>
#include <assert.h>
using namespace std;
#include <stack>
bool Checksequence(int *stackIn, int *stackOut,int lenIn,int lenOut){
 assert(stackIn && stackOut);
 if (lenIn != lenOut)         //两个序列长度不相等,不合法
  return false;
 stack<int> s;
 for (int i = 0; i < lenIn; i++){
  int j = 0;
  s.push(stackIn[i]);
  while (s.size() > 0 && s.top() == stackOut[j]){       //入栈序列栈顶元素与当前出栈序列元素不相等,不合法
   s.pop();
   j++;
  }
 }
 return (s.size()>0) ?false:true;                //当所有出栈序列元素都匹配完之后,栈不为空,不合法
}
int main(){
 int stackIn[] = { 1, 2, 3, 4, 5 };       //入栈序列
 int stackOut[] = { 5, 4, 2, 3, 1 };      //出栈序列
 int len_in = sizeof(stackIn) / sizeof(stackIn[0]);      //入栈序列长度
 int len_out = sizeof(stackOut) / sizeof(stackOut[0]);   //出栈序列长度
 bool ret = Checksequence(stackIn, stackOut,len_in,len_out);
 if (ret)
  cout << "出栈顺序合法" << endl;
 else
  cout << "出栈顺序不合法" << endl;
 return 0;
}
时间: 2024-12-16 19:34:48

C++:检查出栈顺序的合法性的相关文章

元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5)。出栈序列为(4,5,3,2,1)

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后

判断栈的出栈顺序合法性

栈的出栈顺序合法性是指给定一系列元素,如1 - N,按照从小到大的方式入栈,每个元素的出栈时机不定.题目给定一个出栈顺序,我们来判断这个出栈顺序有没有可能发生. 比如对[1,2,3,4,5,6,7,8,9]: [1,2,3,4,5,6,7,8,9]是一个合法出栈序列 [9,8,7,6,5,4,3,2,1]也是一个合法序列 [4,5,3,2,7,6,1,8,9]也是一个合法序列 [3,4,5,1,2,9,8,7,6]就是一个非法序列 判断方法有两种,一种是对每一个值,其后所有小于它的值的数是一个降

判断元素出栈,入栈顺序的合法性

问题:元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,1,2) 定义一个栈sp,入栈序列为str1,出栈序列为str2,长度分别为size1和size2.如果两个序列为空或长度不等,则不合法,针对长度相等且不为空的两个序列进行判断. 先将str1中第一个元素入栈,然后通过循环使str1后移. 1.如果当前栈为空且入栈序列不为空,则入栈序列str1后移,sp入栈. 2.如果栈顶元素不等于出栈序列且入栈序列不为空,则入栈序列str1后移,sp入栈. 3.如果栈

出栈顺序 与 卡特兰数(Catalan)的关系

一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3  ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2.2 1 3.2 3 1.3 2 1 二,问题分析 先介绍几个规律: ①对于出栈序列中的每一个数字,在它后面的.比它小的所有数字,一定是按递减顺序排列的. 比如入栈顺序为:1 2 3 4. 出栈顺序:4 3 2 1是合法的,对于数字 4 而言,比它小的后面的数字是:3 2 1,且这个顺序是递减顺序.

全是套路——出栈顺序

实习终于结束了,好久没有总结编程问题了,因为最近真是没怎么写程序. 今天做华为的火车进站问题,这是一道看似像全排列,其实是栈的问题. 看了一些网上的写法,掌握了一种思路,也是种投机取巧的方法: 先产生序列的全排列,然后再全排列里面去除不可能的出栈顺序. 1.全排列很好产生,用stl里面的next_permutation(begin,end) 2.判断这个排列是不是正确的出栈顺序. 就第2点: 1.给一种进栈顺序加上序号,比如4,2,8这么进栈,则4为0,2为1,8为2,以此类推.只是想表明一个顺

n个元素进栈,共有多少种出栈顺序?

原文:http://blog.csdn.net/zyearn/article/details/7758716 近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序:2个元素进栈,有2种出栈顺序:3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序? 说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题.最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式. 我们把n个元素的

出栈顺序(卡特兰数)

题目描述: 按照1,2,...,n-1,n的顺序入栈,问可以得到多少种出栈序列.如n=3时有1 2 3,1 3 2,2 1 3,2 3 1,3 2 1共5种出栈序列. 解题思路: 设f(n)为n个数时的方案数. 可知 f(0)=1: f(1)=1: f(2)=2:  f(3)=5: 当n=4时 : F1    F2    F3    F4 1 2 3 4  //四种状态分别标记为F1,F2,F3,F4 若F1 位于一号位置 则之前的数字出栈顺序的情况数为F(0),在一号位置后的数字出栈顺序的情况

数据结构经典问题——出栈顺序 转载至:canlynet微博

对于数据结构的问题,如果思路稍有不对,就容易陷入逻辑混乱.我希望自己对数据结构的理解,能够给大家一点帮助.我会将所有我有过心得的问题在我的博客上写出来,欢迎大家浏览,如果有什么不对的地方,还请大家指正,有问题可以给我留言,我会尽量解决,谢谢. 声明一下我写博客的初衷:不是炫耀,而是回报.因为我在计算机方面的知识好多都从网上找到答案,因此我也 将自己搜寻整理的材料,自己写的材料,展示到网上,算是尽一份力吧. 一个经典问题如下(不愿意看思路的可以直接看红色字体部分): 一个栈的入栈序列是a,b,c,

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步