AT_tenka1_2013_qualB_b 天下一後入れ先出しデータ構造
题目描述
栈是最基本的数据结构之一,它以后进先出(Last In First Out,LIFO)的方式存储数据。栈最初为空,可以进行元素的添加和取出操作,但取出操作总是按照最后添加的顺序进行。
有一天,在天下一株式会社工作的ユウヤ君被要求扮演栈的角色。你担心ユウヤ君,于是决定帮他处理输入中给出的命令序列,并按照要求输出结果。
---
输入以如下格式从标准输入给出。
> $Q$ $L$ $query_1$ $query_2$ $\ldots$ $query_Q$
- 第 $1$ 行给出命令的数量 $Q$($1 \leq Q \leq 10^5$)和栈的最大容量 $L$($1 \leq L \leq 2147483647$),两者以空格分隔。
- 第 $2$ 行到第 $Q+1$ 行的 $Q$ 行中,第 $i$($1 \leq i \leq Q$)行给出第 $i$ 条命令。
每条命令属于以下 $4$ 种之一:
1. Push $N$ $M$
- 向栈中添加 $N$ 个元素 $M$。不输出任何内容。
2. Pop $N$
- 从栈中取出 $N$ 个元素。无输出。
3. Top
- 输出栈顶元素,输出占一行。该操作不会改变栈的内容。
4. Size
- 输出栈中元素的数量,输出占一行。
$N$、$M$ 均为整数,满足 $1 \leq N \leq 10^5$,$-2^{20} \leq M \leq 2^{20}$。
其中,栈顶元素指的是当前最后被加入的元素,即如果此时执行一次 Pop 1,将被取出的元素。
- 若 $Q \leq 50$,$N \leq 50$,则本题可获得 $30$ 分的部分分(满分 $60$ 分)。
请依次处理所有命令,并在遇到 Top 或 Size 命令时输出结果。
但在以下 $3$ 种情况下,栈会抛出异常并终止:
- 若在元素数量大于 $L-N$ 的栈上执行 Push $N$ $M$
- 若在元素数量小于 $N$ 的栈上执行 Pop $N$
- 若在空栈上执行 Top
栈抛出的异常如下:
- 若因 Push 操作异常导致程序终止,输出 `FULL`
- 若因 Pop 或 Top 操作异常导致程序终止,输出 `EMPTY`
这些异常均输出一行,且异常发生后栈会放弃后续所有命令。
如果栈能顺利处理所有命令,则最后输出一行 `SAFE`。
```
7 20
Push 2 3
Push 4 5
Top
Size
Pop 5
Top
Size
```
```
5
6
3
1
SAFE
```
```
1 10
Push 40 40
```
```
FULL
```
```
5 10
Push 1 2
Top
Pop 1
Top
Size
```
```
2
EMPTY
```
```
4 10
Top
Size
Push 1 1
Top
```
```
EMPTY
```
输入格式
第 $1$ 行包含两个整数 $Q$ 和 $L$,以空格分隔。
接下来 $Q$ 行,每行一条命令,格式如下之一:
- `Push N M`
- `Pop N`
- `Top`
- `Size`
输出格式
每遇到一次 Top 或 Size 命令,输出一行结果。
若遇到异常,输出一行 `FULL` 或 `EMPTY`,并终止程序。
若所有命令均正常处理,最后输出一行 `SAFE`。
说明/提示
- $Q$ 的最大值为 $10^5$,$L$ 的最大值为 $2147483647$。
- $N$ 的最大值为 $10^5$,$M$ 的取值范围为 $-2^{20}$ 到 $2^{20}$。
- 若输入规模较小($Q \leq 50$,$N \leq 50$),可获得部分分。
- 注意高效实现栈的操作,避免超时或内存超限。
由 ChatGPT 4.1 翻译