【PAT甲级题解】1051 Pop Sequence (25分)

本题单纯考栈的应用,直接使用STL的stack函数或者自己用数组模拟stack也可,这里我使用STL,题目大意讲,给定m,n,k三个数,m代表stack中最大能存数的个数,n代表给出的待测试序列的长度,m代表以下共有几个输入的序列,编程时,对于这种测试有很多行的数据,应该将其规模化简后逐一处理,这样就有了一种类似于流程化程序处理的感觉,会让思路清晰,这到题里我选择用一个while循环控制k个待测试序列输入,对于每一个k来说,用一个int数组存储输入待判断的序列,并选择用mark标记当前出栈顺序,对于这种出栈顺序的问题,我们用for循环控制变量i从1~n枚举,将当前i代表的数字入栈,并在for循环中用while判断当前入栈的栈顶元素是否与当前mark标记所代表的数组元素相同,如果相同,则让栈顶元素出栈,mark++,但是在这里有问题存在,如果此时栈空了,在使用top函数的时候程序会崩溃,(在stack中使用top或者pop函数的时候,一定要先判断栈是否非空,就算是在if或者是while的循环体中判断的时候也要先判断是否非空,在使用top等函数)所以,while函数里需要判断的还有当前栈是否非空,当然,因为题干有限制栈内元素的个数,所以,在每次push后,需要对当前栈内元素个数进行判断,一旦超出m,就直标记并接结束程序。当循环执行完成后,如果栈非空,那说明这是一个不合法的出栈序列,或者,因为我们使用mark标记数组的,只有当合法出栈序列出现的时候才会存在mark++,因此,如果for循环结束后,mark代表的数字不是n的话,也可以判断当前出栈序列存在问题,即应该输出NO

代码:

#include<iostream>
#include<stack>
using namespace std;

int main() {
    int m, n, k;
    cin >> m >> n >> k;
    int arr[n];
    while (k--) {
        stack<int> st;
        for (int i = 0; i < n; ++i)
            cin >> arr[i];
        int mark = 0, key = 0;
        for (int i = 1; i <= n; ++i) {
            st.push(i);
            if (st.size() > m) {
                key = 1;
                break;
            }
            while (!st.empty() && st.top() == arr[mark]) {
                st.pop();
                mark++;
            }
        }
        if (!st.empty())
            key = 1;
        if (key == 1) {
            cout << "NO" << endl;
            continue;
        } else {
            cout << "YES" << endl;
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苯酸氨酰糖化物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值