判断一个数列是否是栈的有效输出序列

该博客介绍如何判断一个给定的输出序列是否是栈的有效输出。通过问题分析、伪代码和实际代码实现,解释了如何遍历输入序列并使用栈来验证输出序列的正确性。博主强调了预先编写伪代码以清晰思路的重要性。
摘要由CSDN通过智能技术生成

【问题描述】给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,则为有效输出,返回总的出栈次数,如果不能,则为无效输出,返回0。序列的输入及输出都是从左往右。

1、输入输出序列皆为正整数,可能有重复的数字

2、如果一个数字在输入序列中没有出现,但在输出序列中出现,则为无效输出。

3、如果一个数字在输入序列中出现,但在输出序列中没有出现,只要输出可以通过对输入数字进行出栈操作获取,仍然为有效输出。

【输入形式】第一行包含两个数字:输入序列的长度与输出序列的长度;第二行为输入序列的数字;第三行为输出序列的数字。输入数据以空格隔开。

【输出形式】如果是一个有效的出栈序列,则返回总的出栈次数, 否则返回0
【样例输入1】

5 5

1 2 3 4 5

4 5 3 2 1

【样例输出】5
【样例说明】

可以按以下顺序执行:

push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

通过5次pop操作可以得到输出序列,因此返回5

【样例输入2】

5 5

1 2 3 4 5

4 3 5 1 2

【样例输出】0
【样例说明】

1不能在2之前输出,因此返回0

问题分析

解决这个问题我们可以申请一个栈,然后从输入序列开头一个一个判断是否等于输出序列的头。举个简单的例子。比如输入序列为1、2、3、4输出序列为3、4、2、1,这是输出序列第一个数字为3,我们就从输入序列开始寻找3,直到找到3,而假如3之前有数据我们就把它们存入栈中,在输入序列中,开始碰到的是1元素,和输出序列的第一个元素不相等,我们就把1放入栈中,然后就是2元素,也不想等,也放入栈中,然后就是3,这时候和输出序列的第一个元素相等,我们就把输出序列的下标移到2,而输入序列的下标移到3,这时候输出序列的元素为4,先个栈顶元素比较,发现不相等,这时候元素要么在输入序列的后面,要么就没有,我们在输入序列里面寻找,此时的出入序列指到元素4正好和输出序列的元素相等,于是我们把输出序列和输入序列的下标都加上1,此时输入序列已经弄完了,而输出序列指着2,我们也先和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1,这时候输出序列直到元素1,我们再和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1。这时候我们发现栈为空,而且输入序列的下标已经直到输入序列的末尾,这说明输出序列是栈的输出序列,我们返回true,否则我们返回false;

伪代码

建立一个栈,
cin>>输出数组out
cin>>输出数组in
在输入数组中找输出数组的第一个元素
没找到 cout<<0;return 0;
找到了,这个数之前的所有输入数组(in)的元素进栈push

for(int index_out=1,index_out<out_length;i++){
   
	if(栈非空&&栈顶==out[index_out]){
   //注意这里的栈非空!!!就因为这个一开始每过比如说1234,找第一个元素一开始就找到了,没有进行push操作。
		pop(栈顶元素)
	}
	else{
   
	在in[index_in]后面找
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值