简单的模拟出栈入栈操作,将元素依次入栈。然后根据输入的次序依次出栈。比如给出的出栈次序是 1 4 3 7 6 2 5,首先将1入栈,发现输入数据中的第一个正好是1。将1出栈,下面是4,由于栈是空,并且刚才只把1入栈,接下来将2 3 4依次入栈,些时栈顶元素是4,与输入数据的第二个元素相等,将4出栈。然后3出栈,接下来处理7,由于此时栈顶元素是2,7大于2所以接下来将5 6 7依次入栈(栈中元素为7 6 5 2)。然后栈顶元素与输入数据的7比较相等,7出栈,然后6也相等,6出栈。此时栈中元素(5 2),待判断的输入数据为2 5。2与栈顶元素比较2<5,所以这个序列是不可能出栈顺序。
#include<stdio.h>
#include<stack>
using namespace std;
const int MAXN =1000+10;
int n,s[MAXN];
int main()
{
while(scanf("%d",&n)==1)//有n个数按顺序进栈
{
stack<int>s1;
int a=1,b=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);//给出的出栈顺序
}
int p=1;
while(b<=n)
{
if(a==s[b])
{
a++;
b++;
}
else if(!s1.empty()&&s1.top()==s[b])
{
s1.pop();
b++;
}
else if(a<=n)
{
s1.push(a++);
}
else
{
p=0;
break;
}
}
printf("%s\n",p?"yes":"no");
}
}
#include<stack>
using namespace std;
const int MAXN =1000+10;
int n,s[MAXN];
int main()
{
while(scanf("%d",&n)==1)//有n个数按顺序进栈
{
stack<int>s1;
int a=1,b=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);//给出的出栈顺序
}
int p=1;
while(b<=n)
{
if(a==s[b])
{
a++;
b++;
}
else if(!s1.empty()&&s1.top()==s[b])
{
s1.pop();
b++;
}
else if(a<=n)
{
s1.push(a++);
}
else
{
p=0;
break;
}
}
printf("%s\n",p?"yes":"no");
}
}