解题过程的小记录,如有错误欢迎指出。
难度:三星(stack的用法)
题目分析
规定栈的大小,按照1~n的顺序入栈,随机出栈,给出数列看是否可以通过出栈获得
注意点
- 在取用栈的top元素前需要判断栈是否为空
我的解题过程
思路
- 把需要判断的数列放入vector数组中,设置pos指向要从栈中找到的数
- 设置一个栈,按1~n的顺序入栈,在每个数入栈后,循环判断top元素是否是需要找的数列元素,如果是则一直pop,如果不是则继续入栈下一个数
- 在入栈完了后,如果vector中的数没有没循环找完(通过pos进行判断),就说明这个数列不可能,如果循环找完,说明可以通过pop找完
bug
- 在使用top元素前没有判断是否为空
- 把入栈数直接在while里面自增,导致判断后入栈的数大了一位
代码
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main()
{
int m, n, k;
scanf("%d %d %d\n", &m, &n, &k);
for (int i = 0; i < k; i++) {
vector<int> sequence(n);
for (int j = 0; j < n; j++) {
scanf("%d", &sequence[j]);
}
stack<int> s;
int num = 1, pos = 0;
while (num <= n) {
if (s.size() < m) s.push(num);
while (!s.empty()&&sequence[pos] == s.top()) {
s.pop();
pos++;
}
num++;//*******原来在这里写错了,不能直接写在while的循环里面,不然插入栈的数字会有误
}
if (pos == n) printf("YES\n");
else printf("NO\n");
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
本题记自己的就好啦