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

对于数据结构的问题,如果思路稍有不对,就容易陷入逻辑混乱。我希望自己对数据结构的理解,能够给大家一点帮助。我会将所有我有过心得的问题在我的博客上写出来,欢迎大家浏览,如果有什么不对的地方,还请大家指正,有问题可以给我留言,我会尽量解决,谢谢。

声明一下我写博客的初衷:不是炫耀,而是回报。因为我在计算机方面的知识好多都从网上找到答案,因此我也

将自己搜寻整理的材料,自己写的材料,展示到网上,算是尽一份力吧。

一个经典问题如下(不愿意看思路的可以直接看红色字体部分):

一个栈的入栈序列是a,b,c,d,e则栈的不可能的输出序列是:()

A edcbd         B decba           C dceab            D abcde

栈之根本——先进后出(first in,lastout)初次接触到这个问题的人,或许会认为入栈abcde,所以出栈只能是edcba所以BCD都不对。

其实是这个问题描述有歧义,应该是分段入栈的顺序,也就是说,可能先入栈a,取出a,入栈b,取出b……,所以D也是可能的。

知道这个意思了以后,就要明确这个问题的矛盾根本所在:第一次出栈d,说明什么?说明a,b,c一定早已入栈(入栈顺序决定的)。那么在出栈d以后,a,b,c的出栈顺序一定是c,b,a,而不用理会中间穿插着出栈了d后面的字符(因为可以再入栈,再出栈嘛)。所以立即选中C,不用犹豫,理由简单:d出栈了,abc一定已经入栈,那么abc只能以cba的顺序出栈,C不符合,OK!This problem is so esay, Thanks for my teacher Wang Shanshan.

数据结构中的思路一定要单一,要简明,抓住问题根本,万不可考虑过多,试探法只有在不知道解题思路的情况下去尝试,尝试多了,你会发现,逻辑容易混乱,俗称“我晕”!

时间: 2024-10-26 02:15:08

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

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

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

出栈顺序问题的一般解决方法

方案 设有一个栈为s 设有一队列q,q存储了要求的s中元素出栈的顺序 设有一队列q_push,其中存储了元素的入栈顺序 判断栈顶元素是否可以出栈,若为空,或者不为空但是栈顶元素不是q中当前数据,则不可以出栈.否则可以出栈 若栈顶元素可以出栈,则将其进行出栈,并将q队首元素出队 若栈顶元素不可以出栈,则在队列q_push中元素不为空且不等于q的队首元素的情况下,将q_push持续出队,并将弹出的队首元素都入栈到s中. 当循环结束时,q_push只有空与非空两种可能.空说明没找到这样一个符合要求的元

栈的合理出栈顺序(列车厢调度)

列车厢调度 一道较为明显的栈的可能出栈顺序的变式题,2是栈,3是出栈序列,很水一道变式应用 1 ====== <--移动方向 / 3 ===== 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过"列车厢调度问题"(当然没见过也不要紧).今天,我们就来实际操作一下列车厢的调度.对照上方的ASCII字符图,问题描述如下: 有三条平行的列车轨道(1.2.3)以及1-3和2-3两段连接轨道.现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要

全是套路——出栈顺序

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

出栈顺序(卡特兰数)

题目描述: 按照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),在一号位置后的数字出栈顺序的情况

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

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为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,且这个顺序是递减顺序.