紫书 P140,栈的模板题。
秒切这题的 dalao 请跳过本文
这是写给像我一样菜的蒟蒻的
题目
题意
已知入栈序列 $1,2,3,4,...n,问能否得到出栈序列Target_1,Target_2,Target_3,...Target_n$(要求每个元素只进栈一次)
输入格式
单个输入文件中包含若干组数据。
每组数据第一行给出n
之后若干行,每行表示一个询问,每行n个数,第i个数表示Target_i,保证为 $1,2,...,n$ 的一个排列
Target_1=0表示该组输入结束
n=0表示输入结束
输出格式
对于每个询问,输出 Yes
或 No
每两组数据间应有一空行
解答
分析
令A表示下一个进栈元素,Target_B表示下一个期望元素
初始化,A=B=1
,栈 s
为空
对于每一个 A,分类讨论:
1.A=Target_B,显然 A 进栈后立即出栈,A++
,B++
2.栈非空且s.top()=Target_B,即栈顶元素为下一个期望元素,s.pop()
出栈,B++
3.A<=n,说明还有输入,但期望的元素并不是它或栈顶元素,那只能入栈(没有其他方案)
4.以上情况均不满足,说明输入已经全部入栈,栈中有元素但并不是期望元素,一定无解
AC 代码
#include<iostream>
#include<stack>
using namespace std;
const int MAXN=1005;
int n,target[MAXN];
void solve();
int main(){
while((cin >> n)&&(n)){
while((cin >> target[1])&&(target[1])){
for(int i=2;i<=n;i++) cin >> target[i];
solve();
}
putchar('\n');
}
return 0;
}
void solve(){
stack<int> s;
int A=1,B=1;
while(B<=n){
if(A==target[B]) {
++A;
++B;
}
else if((!s.empty())&&(s.top()==target[B])){
s.pop();
++B;
}
else if(A<=n) s.push(A++);
else {
cout << "No\n";
return;
}
}
cout << "Yes\n";
return;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于