【C++】验证栈序列(栈练习)

该博客讨论了如何使用C++验证一个给定的入栈pushed序列和出栈popped序列是否合法。博主解释了栈的基本概念,包括后进先出(LIFO)原则,并列举了常见的栈操作。接着,博主提出了一个验证栈序列的题目,给出了输入和输出格式,并表示已用栈实现了解决方案,期待其他更简洁的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

望各位小牛,小犇,中牛,中犇,大牛,大犇,神牛,神犇给予鼓励

小小蒟蒻在此先%%%%%%%%%%%%%%%%%拜大神

1.定义

栈(stack),它是一种运算受限的线性表,后进先出(LIFO)

LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据,最后一个数据被第一个读出来。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶,另一端为栈底;栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈,删除则称为退栈。栈也称为后进先出表。

 2.常见操作

(1)初始化栈:stack<数据类型> st;,初始条件:栈st不存在。操作结果:构造了一个空栈;

(2)入栈操作:st.push(元素名) ,初始条件: 栈st 存在。操作结果: 对已存在的栈st,插入一个元素x 到栈后,栈发生变化又称压栈;

(3)出栈操作: st.pop() ,初始条件: 栈st 存在且非空,操作结果: 删除栈首元素,并返回其值,栈发生变化;

(4)读栈头元素:st.front() ,初始条件: 栈st存在且非空,操作结果: 读栈头元素,并返回其值,栈不变;

(5)判栈空操作:st.empty() ,初始条件:栈st 存在,操作结果: 若st为空栈则返回为1,否则返回为0。

(6)读长度元素:st.size() ,初始条件:栈 st存在且非空,操作结果: 返回st栈的个数;

(7)读栈尾元素:st.back() ,初始条件: 栈st 存在且非空,操作结果: 读栈尾元素,并返回其值,栈不变;

3.题目:验证栈序列

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 q,询问次数。

接下来 q 个询问,对于每个询问:

第一行一个整数 n表示序列长度;

第二行 n 个整数表示入栈序列;

第三行 n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

输入 1

2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3

输出 1

Yes
No

注:这套测试数据很水

废话少说,上代码

#include<bits/stdc++.h>//万能头
using namespace std;
stack<int> st;//浅写一个栈
int pushed[1000005],poped[1000005],n,l;
//两个序列数组(popshed入栈序列,poped出栈序列),询问次数,序列长度。
int main(){
	cin>>n;//输入询问次数
	for(int i=1;i<=n;i++){
		cin>>l;//for循环输入序列长度
		for(int j=1;j<=l;j++){
			cin>>pushed[j];//双重for循环输入入栈序列
		}
		for(int j=1;j<=l;j++){
			cin>>poped[j];//双重for循环输入出栈序列
		}
        int a = 1;//可以说是计数器吧
		for(int k=1;k<=l;k++){
			st.push(pushed[k]);//把入栈序列的第k个压进栈中
            while(!st.empty() && poped[a]==st.top()){//无脑while,条件为非空且出栈序列的第a个和st栈的栈顶相等
				st.pop();//弹出栈顶
				a++;//计数器自增
			}
		}
		if(st.empty()){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}//这里是判断
		while(!st.empty()){
			st.pop();//这里就不用我说了,在下一次开始之前清空栈
        }
	}
	return 0;
}

我是用栈做的,还有更多简单的方法,请各位大神多多指点

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

有任何细小错误请大神指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值