这道题其实算栈中一道比较经典的题目。之前在数据结构试题里遇到过相关的题,但是是根据弹出序列来进行判断的,也就是如果你要弹出某些元素,该元素之前的元素肯定被弹出过,但是相关的细节思路想不出来,后面会做出相关的总结;
其实主体思路很简单,但是第一次的时候并没有想出来:
先置flag=true,对于输入的1~N个数,挨个入站,然后在每次压栈之后看栈顶元素是否和判定输出队列的第i元素相同;
如果相同,则代表栈顶的元素可以输出,此时就重复进行出栈并比较,并且每次比较如果相同也要将判定输出队列索引+1;
如果不相同,代表栈顶元素可以留着,进行下一次压栈,但是压栈的时候要记得进行栈容量判定,如果栈满直接flag==false退出。
判定条件就是上述操作之后栈空并且flag=true,此时,证明输出序列可靠,不然,其他所有情况全部为不符合条件;
#include<stdlib.h>
#include<stdio.h>
#include<vector>
using std::vector;
int main(){
int stack_max,sequence_length,num;
scanf("%d%d%d",&stack_max,&sequence_length,&num);
if(num==0||stack_max==0||sequence_length==0){
printf("NO\n");
return 0;
}
for(int i=0;i<num;i++){
vector<int>s;
vector<int>input_sequence;
input_sequence.resize(1001);
bool flag=true;//判别标志
//进行输入
for(int j=0;j<sequence_length;j++){
scanf("%d",&input_sequence[j]);
}
int input_index=0;
for(int index=0;index<=sequence_length;index++){
if(index==0)
s.push_back(1);
else{
if(s.size()>stack_max){
flag=false;
//此时栈满不符合规定
}else{
if(input_sequence[input_index]==s[s.size()-1]){
//printf("出现相等的元素\n");
while(s.size()!=0&&input_sequence[input_index]==s[s.size()-1]){
//printf("相等元素为%d\n",s[s.size()-1]);
input_index++;
s.pop_back();
}
if(index!=sequence_length){
s.push_back(index+1);
//printf("不相等,进行压栈:%d\n",index+1);
}
}else{
if(index!=sequence_length){
s.push_back(index+1);
//printf("不相等,进行压栈:%d\n",index+1);
}
}
}
}
}
if(flag==1&&s.size()==0){
printf("YES\n");
}else{
printf("NO\n");
}
}
system("pause");
return 0;
}