1051 Pop Sequence 需再做
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1051 Pop Sequence 需再做相关的知识,希望对你有一定的参考价值。
1. 很精致的一道题,直接就没思路翻书解决的。关键语句是,在for循环中嵌套while循环,每个for循环入栈一个元素,然后while循环判断栈顶元素是否和要判断的序列的当前元素相同,如果相同,弹栈+序列指针后移。
2. 注意弹栈之前都要判空,另外最后要满足栈为空才能说明指定序列正确。
AC代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 1010;
stack<int> st;
int que[maxn];
int main(){
int sl,ql,qn;//栈的深度,待检验序列长度,待检验序列数量
scanf("%d%d%d",&sl,&ql,&qn);
while(qn--){
//清空栈
while(!st.empty())st.pop();
//读入待检验的出栈序列
for(int i=0;i<ql;i++){
scanf("%d",&que[i]);
}
int cur = 0;//指向出栈序列的当前元素
bool isValid = true;//是否合法
for(int i=1;i<=ql;i++){
st.push(i);
if(st.size()>sl){
isValid = false;
break;
}
//当栈顶元素和序列当前元素的位置相同
while(!st.empty()&&st.top()==que[cur]){
cur ++;
st.pop();
}
}
if(isValid&&st.empty())printf("YES\\n");
else printf("NO\\n");
}
return 0;
}
以上是关于1051 Pop Sequence 需再做的主要内容,如果未能解决你的问题,请参考以下文章