例: 5 6 4 3 7 2 1 MaxStackSize=5 out YES
第一个内循环获取单个判断序列,不能直接判断 ,可能造成部分数据无法吸收
演算纸上的思路大致写了一下,比较乱,不想看的话直接看下面的代码吧
begin
5 judge_5 >> 0 push 实际压栈为1~4 ,但要模拟也将5压栈
6 judge_5+1 == 6 (5为现在的max) go
4 judge_max > 4
judge_top == 4 pop go
3 judge_max > 3
judge_top == 3 pop go
7 judge_max+1 == 7
judge_stack.size > max //continueJudge
2 judge_max>2
judge_top==2 pop go
1 judge_max>1
judge_top==1 pop go
out stack.empty == true
"YES"
else "NO"
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int max,n,k,maxSc;
cin>>max>>n>>k;
int sc[n+1],num=0,err;//err为1时是有错
stack<int> s;
sc[0]=0;
for(int I=0 ; I<k ; I++)
{
s=stack<int>();//清空栈操作
maxSc=num=err=0;
//获取出栈序列
for(int i=1 ; i<=n ; i++)
{
cin>>sc[i];
}
//开始判断
for(int i=1 ; i<=n ; i++)
{
if(maxSc+1 < sc[i])//need push
{
for(int j=maxSc+1; j<sc[i];j++)
s.push(j);
maxSc=sc[i];
if(s.size()+1>max)//Full+
{
err=1;
//printf("错误原因1 黑匣子入栈超出\n");
break;
}
}
else if(maxSc+1 == sc[i])
{
maxSc++;
if(s.size()+1>max)
{
err=1;
//printf("错误原因2 模拟入栈超出\n");
break;//Full+
}
}
else if(maxSc>sc[i])
{
if(sc[i]==s.top()&&!s.empty())
s.pop();
else
{
err=1;
//printf("错误原因3 出栈错误\n");
break;//number error
}
}
}
if(s.empty()&& !err)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
(我在代码里在存放该序列时在序列最前加了一个0,这是个无用的操作,因为本来打算使用pre 和 now 做,但是存在缺陷,于是改成了判断已有序列的最大值,后来懒得删掉就留着他了)