顺序出栈(模拟栈)

顺序出栈

Description
给出一个容量为m的栈和一个1~n的任意排列和,
将n个数按照给定排列压入栈中,请你求出其是否能
够以1,2,3…n的方式出栈。
Input
第一行给出n和m,其中1<=m<=n<=1000,
第二行给出长度为n的排列。
Output
如果给定的排列能以1,2,3…n的方式出栈,输出YES,
否则输出NO。
Sample Input 1
7 5
1 2 3 4 5 6 7
7 5
1 7 6 5 4 2 3
7 6
7 6 5 4 3 1 2
7 6
7 6 5 4 3 2 1
Sample Output 1
YES
YES
YES
NO

思路:可能是我入戏太深, 栈的出栈顺序可能本来就没搞懂再加上题意没看懂,才没做出来吧
本来以为会用到栈混洗(可判断出栈顺序是否合理),但是模拟就能做(能否按指定出栈顺序出栈)。

#include<bits/stdc++.h>
using namespace std;

queue<int> s; //开始的顺序
stack<int> t; //初始栈
queue<int> e; //结果顺序

int main(){
    int n, m;
    while(cin >> n >> m){
        int temp;
        for(int i = 0; i < n; i++){
            cin >> temp;
            s.push(temp);
        }
        int key = 1;
        while(!s.empty()){
            t.push(s.front());
            s.pop();
            
            //栈未满
            if(t.size() < m){
                if(t.top() == key){
                    e.push(key);
                    t.pop();
                    key++;
                }
            }
            
            //栈已满
            else if(t.size() == m){
                if(t.top() != key){
                    e.push(t.top());
                    t.pop();
                }else{
                    while(!t.empty()){
                        if(t.top() == key){
                            e.push(t.top());
                            t.pop();
                            key++;
                        }else{
                            break;
                        }
                    }
                }

            }

        }
        int cnt = 0;
        while(!e.empty()){
            cnt++;
            if(e.front() != cnt){
                break;
            }

            e.pop();
        }
        if(cnt != n){
            cout << "NO" << endl;
        }else{
            cout << "YES" << endl;
        }

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值