一、题目:
输入输出:
二、分析过程:
题目本质意思:
一组数1~N从小到大的顺序入栈,给出出栈的顺序,判断能否满足这种情况(即能否按这种情况出栈)
解题思路:
本质上就是将数1~N按照所给的出栈顺序来出栈,如果出栈成功,说明满足要求,否则不满足要求
具体步骤:
1.先将给出的出栈顺序存在一个数组out中
2.将数据1~N按从小到大的顺序输入到一个栈中,每栈入一个元素后,将栈顶元素与out[j](j初始化为0)比较,如果out[j]等于栈顶元素,则栈顶元素出栈,同时j++,重复这个比较过程直至out[j]不等于栈顶元素。然后继续栈入下一个元素,重复上面的过程
3.如果最后j==N,说明按要求出栈成功,否则出栈不成功
三、代码:
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int main() {
int n;
while(cin >> n && n) { //当n为0时,测试结束
int m;
while(cin >> m && m) {
//当输入的第一个数为0时,输出一个空白行,并进入下一个样例测试
int out[1000] = {0};
out[0] = m;
for(int j = 1; j < n; j++) cin >> out[j];
stack<int> my;
int i = 0, j = 0;
for(i = 0; i < n; i++) {
my.push(i+1);
//根据所给的出栈顺序来栈出元素
while(j < n && !my.empty() && out[j] == my.top()) {
my.pop();
j++;
}
}
// j == n 表示按所给的出栈顺序成功出栈
if(j == n) cout << "Yes\n";
else cout << "No\n";
}
if(!m) cout << endl;
}
return 0;
}
四、考查点:
1.栈中元素出栈的多种情况
2.栈的基本操作(入栈,出栈)
3.灵活解决问题的能力
五、题后反思
1.一开始题目的意思没有弄清楚,没有弄懂题目的本质(对于这种大段大段的英文题,一定耐心仔细地看完,以后多做英文题!)
2.一开始分析问题的方向不对,想着先分析有哪些栈出情况,企图通过比较来确定最终答案,然后就越分析越乱(情况很多,分析混乱)
3.其实想清楚后,思路很简单,就是看它能不能按要求成功地出栈