题目POJ 1363
题意
1-n顺序入栈,判断出栈顺序是否合法
思路
用栈和队列,模拟入栈出栈操作
-
将元素顺序压入栈中
-
每压入一个数字,判断是否和队列的头元素相等,若相等,就在栈和队列中弹出这两个元素
-
直到两元素不相同
-
如果最后栈不为空,说明不是合法序列
输入
5//序列元素个数
1 2 3 4 5//出栈顺序
5 4 1 2 3//出栈顺序
0//5个数的序列判断结束
6//序列元素个数
6 5 4 3 2 1//出栈顺序
0//6个数的序列判断结束
0//输入结束
代码实现
#include <iostream>
#include<cstdio>
#include<stack>
#include<queue>
//判断出栈顺序是否正确
int check_is_valid_order(std::queue<int>&order);
int main()
{
int n;
int train;
scanf("%d",&n);
while(n)
{
scanf("%d",&train);
while(train)
{
std::queue<int>order;
order.push(train);
for(int i=1;i<n;i++)
{
scanf("%d",&train);
order.push(train);
}
if(check_is_valid_order(order))
{
printf("Yes
");
}
else
printf("No
");
scanf("%d",&train);
}
putchar('
');
scanf("%d",&n );
}
return 0;
}
int check_is_valid_order(std::queue<int>&order)
{
std::stack<int>S;
int n=order.size();//1-n顺序入栈
for(int i=1;i<=n;i++)
{
S.push(i);
while(!S.empty()&&S.top()==order.front())
{
S.pop();
order.pop();
}
}
if(S.empty())
return 1;
else
return 0;
}