全是套路——出栈顺序

实习终于结束了,好久没有总结编程问题了,因为最近真是没怎么写程序。

今天做华为的火车进站问题,这是一道看似像全排列,其实是栈的问题。

看了一些网上的写法,掌握了一种思路,也是种投机取巧的方法:

先产生序列的全排列,然后再全排列里面去除不可能的出栈顺序。

1.全排列很好产生,用stl里面的next_permutation(begin,end)

2.判断这个排列是不是正确的出栈顺序。

就第2点:

1.给一种进栈顺序加上序号,比如4,2,8这么进栈,则4为0,2为1,8为2,以此类推。只是想表明一个顺序,4在前面进栈,然后是2最后是8

2.抓住出栈的规则,比如入栈序列:1 2 3 4 5 6,出栈序列,4,3,5,2,6,1。

4先出栈,则4前面的321肯定在栈内,必然是按顺序出栈的(中间可能夹杂其他元素)。3出栈,前面的21肯定也是这样。

所以可以总结一句话:

出栈的每一个元素之后的所有下标比它小的元素,这些元素的下标一定是有序的!

下标:之前所说的序号。就是入栈顺序。

举例来看,4,3,5,2,6,1。4之后的3 2 1有序,3后面的2 1有序,5 后面的 2 1有序,2后面的1有序,6后面的1有序。

所以,这样就简单了。代码就不上了,这是个投机取巧的方法,今天太困了,脑子转不过来,递归写不了。

 
时间: 2024-11-03 21:38:18

全是套路——出栈顺序的相关文章

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出栈,如下图所示 步

写一个算法判断出栈顺序是否正确

入栈的数据:1234567 解决思路: 简单的模拟出栈入栈操作,将元素依次入栈.然后根据输入的次序依次出栈.比如给出的出栈次序是 1 4 3 7 6 2 5,首先将1入栈,发现输入数据 中的第一个正好是1.将1出栈,下面是4,由于栈是空,并且刚才只把1入栈,接下来将2 3 4依次入栈,些时栈顶元素是4,与输入数据的第二个元素相 等,将4出栈.然后3出栈,接下来处理7,由于此时栈顶元素是2,7大于2所以接下来将5 6 7依次入栈(栈中元素为7 6 5 2).然后栈顶元素与 输入数据的7比较相等,7

判断栈的出栈顺序合法性

栈的出栈顺序合法性是指给定一系列元素,如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]就是一个非法序列 判断方法有两种,一种是对每一个值,其后所有小于它的值的数是一个降

出栈顺序 与 卡特兰数(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,且这个顺序是递减顺序.

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)         //两个

n个元素的入栈顺序有多少种出栈顺序?

问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的分析过程如下: n个数据依次入栈,出栈顺序种数的递推公式如下:F(n)=∑(F(n-1-k)*Fk);其中k从0到n-1 已知F0=1,F1=F0*F0=1F2=F1*F0+F0*F1=2F3=F2*F0+F1*F1+F0*F2=5F4=F3*F0+F2*F1+F1*F2+F0*F3=14F5=F4