励志用尽量少的代码做高效的表达。
提交(题目)链接→UVa-514
此题的本质是:给出“入栈顺序”,判断给定序列是否可以出栈。
有点像这种题:
因此思路也类似:
思路:
数组存储列车调度顺序, 栈存储正常入栈顺序, 若数组头=栈顶,数组移到下一位,栈顶元素弹出
遍历完毕后, 若栈空,则说明全部调度完毕, 输出Yes
注意点:
1、输出的是Yes不是YES!(最开始看错,哭晕在厕所)
2、每组结果间有空行,最后一个结果后的空行也不能省略。
3、本题的输入方式很搞心态,输入一个n后,只要接下来的n行不出现0,就可以一直输入下去。 因此可以尝试自底向上的编程方法:先编写主体思路, 最后补充输入格式。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[1010];
int n; while((cin >> n) && n) {
while(cin >> a[1] && a[1]) {
for(int i = 2; i <= n; i++) { cin >> a[i]; }
stack<int> s2;
int j = 1;
for(int i = 1; i <= n; i++) {
s2.push(i);
while((!s2.empty()) && (s2.top() == a[j])) { j++; s2.pop(); }
}
cout << ((s2.empty()&&(j==n+1)) ? "Yes\n" : "No\n");
}
cout << "\n";
}
return 0;
}
收获:
1、自底向上的编程方法。
2、对栈的使用熟练度提高。