pat 甲级 1051 Pop Sequence

本文通过具体的代码实现,探讨了如何判断一系列输入序列是否可以通过栈操作得到。利用C++编程语言,采用栈数据结构,针对特定场景进行了详细的逻辑分析与算法设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈问题
当初学数据结构的时候分析就分析不明白为什么有的序列不对
现在都要用代码来实现了

其实思路很清晰,对应好当前项就可以了

#include <cstdio>
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

int n, m, k;

vector<int> arr;
stack<int> brr;

int main(){

    scanf("%d%d%d",&n,&m,&k);
    arr.resize(m+1);
    for(int i=0; i<k; i++){
        for(int j=0; j<m; j++){
            int a;
            scanf("%d",&a);
            arr[j] = a;     
            //用push—back没读进去?    
        }
        int push = 1;
        int x ;
        bool flag = true;
        while(brr.size() != 0) brr.pop();
        for(int w=0; w<m; w++){

            x = arr[w];

            if(x > push){ //如果当前要弹出的值 比 轮到应该压入的值 大
                          //开始压入值,直到达到了要弹出的值为止
                if(push > m){
                    flag = false;
                    break;
                }

                for(; push <= x; push++){
                    brr.push(push);
                    if(brr.size() > n){
                        flag = false;
                        break;
                    }
                }
                brr.pop();
            }

            else if(x == push){ //如果想等直接弹出
                push++;
            }

            else if(x < push){ //如果小于,当前栈顶的值如果不是要弹出的说明错误
                if(brr.size() !=0 && brr.top() == x){
                    brr.pop();
                }
                else{
                    flag = false;
                    break;
                }
            }

        }
        if(flag) printf("YES\n");
        else printf("NO\n");        
    }

    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值