望各位小牛,小犇,中牛,中犇,大牛,大犇,神牛,神犇给予鼓励
小小蒟蒻在此先%%%%%%%%%%%%%%%%%拜大神
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;
}
我是用栈做的,还有更多简单的方法,请各位大神多多指点
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
有任何细小错误请大神指教