如何判断一个出栈序列的合法性?

baicai_luobo 2012-06-06 03:46:02
相信大家在学数据结构的时候,都遇到过这个问题,就是给定一个入栈顺序(1,2,。。。,n)。然后再给一个出栈的顺序,要你判断它是否合法。我在网上查的一种很普遍的方法,就是这样的一个规则:
出栈序列中的每个数后面的比它小的数,是按递减排列的。
这个规则经过试验很对,但我不知道该怎么证明,那位大虾能帮我证证,或者给个相关的文档、链接什么的都行。
...全文
5864 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
youkuxiaobin 2012-06-23
  • 打赏
  • 举报
回复
入栈就是一段时间后就可以出栈了,所以出栈序列中的每个数后面的比它小的数,是按递减排列的
LBSGG 2012-06-23
  • 打赏
  • 举报
回复
//下面是我个人比较抽浅的理解 仅供参考
1. 出栈系列合法性规则:
出栈序列中的每个数后面的比它小的数,是按递减排列的。
2. 简化规则描述:
(1)假设入栈顺序为1234。
1)若出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,而123是一个
递加系列即不是递减排列,所以不是合法出栈序列。
2)若出栈系列为3142,也不合法,因为3后面比它小的1和2不是递减排列的。
3)若出栈系列为1234,则合法,因为对于每一个数字它后面没有比它小的数字。
(2)假设入栈顺序为123456789abcdef。
1)若出栈系列为67d51f94e2ba83c,因为对于d,它后面比它小的19或123或ac等等都不是递减的,所以
不合法。
2)若出栈系列为379a8b65c4ed21f,可以证明是合法的出栈顺序。因为对于每一个数字它后面没有比它小
的数字而且是按递减排列的。
3. 证明:
假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进
栈之前,比i小的数一定已经进栈了,所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的
下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小
的数一定按严格递减排列.否则出栈系列不合法。
LBSGG 2012-06-23
  • 打赏
  • 举报
回复
//下面是我个人比较抽浅的理解 仅供参考
1. 出栈系列合法性规则:
出栈序列中的每个数后面的比它小的数,是按递减排列的。2. 简化规则描述:
(1)假设入栈顺序为1234。
1)若出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,而123是一个递加系列即不是递减排列,所以不是合法出栈序列。 2)若出栈系列为3142,也不合法,因为3后面比它小的1和2不是递减排列的。 3)若出栈系列为1234,则合法,因为对于每一个数字它后面没有比它小的数字。 (2)假设入栈顺序为123456789abcdef。 1)若出栈系列为67d51f94e2ba83c,因为对于d,它后面比它小的19或123或ac等等都不是递减的,所以不合法。 2)若出栈系列为379a8b65c4ed21f,可以证明是合法的出栈顺序。因为对于每一个数字它后面没有比它小的数字而且是按递减排列的。 3. 证明:
假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进栈之前,比i小的数一定已经进栈了,所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小的数一定按严格递减排列.否则出栈系列不合法。
yxdcbdwfx 2012-06-22
  • 打赏
  • 举报
回复
http://blog.csdn.net/masikkk/article/details/7376106
天台的故事 2012-06-09
  • 打赏
  • 举报
回复
各位,我要是通过数学方式来证明这种规律是正确的,不是问程序的什么问题
baicai_luobo 2012-06-09
  • 打赏
  • 举报
回复
各位,我要是通过数学方式来证明这种规律是正确的,不是问程序的什么问题。
W170532934 2012-06-06
  • 打赏
  • 举报
回复
http://acm.hdu.edu.cn/showproblem.php?pid=1022看下这个题目。就是出栈序列的问题。下面是我的代码。

#include <stdio.h>
#define POP 0
#define PUSH 1
int main()
{
char strIn[10],strOut[10];
char cstack[10];
bool bResultSeq[20];//false in and true out
int nTrains;
int i,j,k;
int nTop;
while(scanf("%d",&nTrains)!=EOF && scanf("%s",strIn)!=EOF && scanf("%s",strOut)!=EOF)
{
nTop=0;
i = 0;//strIn
j = 0;//strOut
k = 0;//bResultSeq
while(i<nTrains)
{
cstack[nTop++]=strIn[i++];
bResultSeq[k++]=PUSH;
while(nTop>0 && cstack[nTop-1]==strOut[j])
{
nTop--;
bResultSeq[k++]=POP;
j++;
}
}
if (nTop>0)
{
printf("No.\n");
}
else
{
printf("Yes.\n");
for (i=0;i<k;++i)
{
if(bResultSeq[i]==PUSH)
printf("in\n");
else
printf("out\n");
}
}
printf("FINISH\n");
}
return 0;
}
qq120848369 2012-06-06
  • 打赏
  • 举报
回复
栈顶和当前出栈序列的第一个数字相同就出栈,不相同就继续入栈。
tongzhipeng5699 2012-06-06
  • 打赏
  • 举报
回复
第一次 pop的时候,将弹出的值保存到int min;
下次pop时候,将弹出的值保存到int temp,然后比较temp和 min,如果temp>=min 则非法,返回
如果temp<min 则将temp值赋给min,然后一次循环到empty,中间没返回则说明合法,循环结束后,返回true;
在计算机科学中,数据结构是组织、存储和处理数据的方式,它是编程的基础。在这个问题中,我们关注的是栈(Stack)这一数据结构,它遵循“后进先出”(Last In First Out,简称LIFO)的原则。栈的操作主要包括入栈(Push)和出栈(Pop)。当一个元素被入栈,它会被放在栈顶;而出栈时,总是栈顶的元素首先被移除。题目要求根据给定的进栈顺序判断一个序列是否为正确的出栈顺序。这意味着我们需要理解栈的操作特性并利用这些特性来验证序列合法性。下面将详细解释这个问题的解决方法。我们考虑一个简单的例子,比如进栈顺序是 `[A, B, C]`,合法的出栈序列可能是 `[A, B, C]` 或 `[B, A, C]`,因为 `B` 在 `A` 之后入栈,所以它必须在 `A` 之前出栈;而 `C` 在最后入栈,因此它必须是最后一个出栈的元素。为了解决这个问题,我们可以采用模拟栈操作的方法。具体步骤如下:1. 创建一个空栈,并初始化一个空的出栈序列。2. 遍历给定的出栈序列。对于每个元素,我们有以下两种情况: - 如果当前元素是进栈序列的第一个元素,那么它必须是第一个出栈的元素,因此我们可以直接将其添加到出栈序列中,并从进栈序列中移除。 - 否则,我们需要检查当前元素是否在栈顶。如果不在,说明该元素不能在这个位置出栈,因为栈遵循LIFO原则。此时,我们需要不断地执行出栈操作,直到栈顶元素等于当前元素或栈为空。如果栈为空但当前元素仍然没有匹配的栈顶元素,那么出栈序列是不合法的。3. 如果我们成功地遍历了整个出栈序列且没有出现非法的操作,那么这个序列就是合法的出栈顺序。在实现这个算法时,可以使用C++的`std::stack`容器来模拟栈。`JudgeIsLegalStQueue.cpp` 文件很可能包含了这样的实现。通常,代码会包括一个函数,接收两个参数,一个是进栈顺序的数组,另一个

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧