1051 Pop Sequence

 

Given a stack which can keep M numbers at most. Push Nnumbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K(the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

Sample Input:

1
2
3
4
5
6
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

 

Sample Output:

1
2
3
4
5
YES
NO
NO
YES
NO

 

思路:

1、按顺序考虑一组查询中的每个元素,对于某一元素t和下一进栈元素next:

  • 如果t=next,则判断栈是否还有空间,有则入栈再出栈(实际上可以省略这一过程,因为入栈之后马上出栈,栈没有发生变化,但此时next需要加1)。
  • 如果t<next,则说明t已经在栈中,判断栈顶元素是否等于t
  • 否则t>next,不断入栈直到栈满或者next==t,这时候同第一种情况,判断栈是否还有空间,有则入栈再出栈。

2、注意使用top() 或者 pop() 函数时需要先判断栈(stack)是否为空,否则很容易报错。

代码:

复制代码
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int main(){
    stack<int>s;
    int n,m,k,next = 1,size = 0;
    scanf("%d%d%d",&m, &n, &k);
    for(int i=0; i<k; i++){
        bool f = false;
        next = 1,size = 0;
        for(int j=0; j<n; j++){
            int temp;
            scanf("%d", &temp);
            if(temp == next){
                if(size < m){
                    next++;
                }else{
                    f = true;
                }
            }else if(temp < next){
                if(size == 0){
                    f = true;
                    continue;
                }
                if(temp != s.top()){
                    f = true;
                }else{
                    s.pop();
                    size--;
                }
            }else{
                while(temp > next && size < m){
                    s.push(next);
                    size++;
                    next++;
                }
                
                if(temp != next || size >= m){
                    f = true;
                }else{
                    next++;
                }
            }
            
            
        }
        printf("%s", f ? "NO\n" : "YES\n");
    }
     
}
复制代码

 

posted @   Yohoc  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示