HM211 单口弹匣
HM211 单口弹匣
来源: 第 211 集 stack容器-基本概念
难度: 普及-
时间限制: 1s
空间限制: 64MB
题目描述
弹匣只有**一个开口**。封死的那一端叫栈底,开口那一端叫栈顶。外界**只能碰到栈顶**那一发:入匣和出匣都只能发生在栈顶。
这种结构符合**先进后出**(也可以说后进先出):先压进去的被压到栈底,后压进去的反而先打出来。往里压弹叫入栈,对应 push;往外弹出叫出栈,对应 pop。
栈**不允许遍历**。遍历必须在不改容器的前提下看遍每一个元素。想看原来压在第二位的那发,只能先把栈顶弹掉,匣里因此少一发——这已经改了容器,不算遍历。
还可以查询匣是否为空(empty)以及当前发数(size)。发数是入栈时累计出来的,不要靠把子弹一发发弹出来再数。
先把 \(n\) 发按顺序入栈,再执行 \(q\) 条指令:
1 x:编号 \(x\) 从栈顶压入;2:弹出栈顶并输出编号;若已空,输出NONE;3:输出栈顶编号;若空,输出EMPTY;4:先输出当前size,再输出empty为真则YES否则NO;5 k:试图在**不改匣**的前提下看见从栈顶往下数第 \(k\) 发(\(k=1\) 就是栈顶)。若匣空,输出EMPTY;若 \(k=1\),输出栈顶;若 \(k>1\),输出FORBIDDEN(中间发次不可见);6:不断从栈顶弹出直到变空,按弹出顺序输出剩余所有编号。这会改掉栈。若已经为空,输出空行。
输入格式
第一行两个整数 \(n\)、\(q\)。
第二行 \(n\) 个整数,按顺序入栈。当 \(n=0\) 时本行可以是空行。
接下来 \(q\) 行,每行一条指令。
输出格式
按指令依次输出。2、3、4、5、6 各占一行。同一行内多个整数用单个空格分隔,行末换行。
样例
输入 #1
3 7
10 20 30
3
4
5 1
5 2
2
3
6
输出 #1
30
3 NO
30
FORBIDDEN
30
20
20 10
输入 #2
0 4
3
4
5 1
2
输出 #2
EMPTY
0 YES
EMPTY
NONE
说明
\(0 \le n \le 1000\),\(1 \le q \le 2000\),\(1 \le k \le 10^9\),编号绝对值不超过 \(10^9\)。
样例 #1:三发依次压入后,栈顶是最后压入的 \(30\);不改匣只能看见这一发,第二发不可见。弹出一发后栈顶变成 \(20\),再把剩余两发按后进先出弹出,先 \(20\) 后 \(10\)。样例 #2 一开始就是空匣。
信息
- ID
- 1210
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者