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"); } }
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现