HM211 单口弹匣

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\) 行,每行一条指令。

输出格式

按指令依次输出。23456 各占一行。同一行内多个整数用单个空格分隔,行末换行。

样例

输入 #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
通过率
?
上传者