UVA 514 - Rails

本贴最后更新于 2079 天前,其中的信息可能已经时异事殊

紫书 P140,栈的模板题。
秒切这题的 dalao 请跳过本文
这是写给像我一样菜的蒟蒻的

题面 提交

题目

题意

已知入栈序列 $1,2,3,4,...nTarget_1,Target_2,Target_3,...Target_n$(要求每个元素只进栈一次)

输入格式

单个输入文件中包含若干组数据。
每组数据第一行给出
之后若干行,每行表示一个询问,每行个数,第个数表示,保证为 $1,2,...,n$ 的一个排列
表示该组输入结束
表示输入结束

输出格式

对于每个询问,输出 YesNo
每两组数据间应有一空行

解答

分析

表示下一个进栈元素,表示下一个期望元素

初始化,A=B=1,栈 s 为空

对于每一个 A,分类讨论:

1.,显然 A 进栈后立即出栈,A++B++
2.栈非空且,即栈顶元素为下一个期望元素,s.pop() 出栈,B++
3.,说明还有输入,但期望的元素并不是它或栈顶元素,那只能入栈(没有其他方案)
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; }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...