【模板】栈
题目描述
请你实现一个栈(stack),支持如下操作:
push(x)
:向栈中加入一个数 x x x。pop()
:将栈顶弹出。如果此时栈为空则不进行弹出操作,输出Empty
。query()
:输出栈顶元素,如果此时栈为空则输出Anguei!
。size()
:输出此时栈内元素个数。
输入格式
本题单测试点内有多组数据。
输入第一行是一个整数
T
T
T,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数
n
n
n。
接下来
n
n
n 行,每行首先由一个字符串,为 push
,pop
,query
和 size
之一。若为 push
,则其后有一个整数
x
x
x,表示要被加入的数,
x
x
x 和字符串之间用空格隔开;若不是 push
,则本行没有其它内容。
输出格式
对于每组数据,按照「题目描述」中的要求依次输出。每次输出占一行。
样例 #1
样例输入 #1
2
5
push 2
query
size
pop
query
3
pop
query
size
样例输出 #1
2
1
Anguei!
Empty
Anguei!
0
提示
样例 1 解释
对于第二组数据,始终为空,所以 pop
和 query
均需要输出对应字符串。栈的 size 为 0。
数据规模与约定
对于全部的测试点,保证 1 ≤ T , n ≤ 1 0 6 1 \leq T, n\leq 10^6 1≤T,n≤106,且单个测试点内的 n n n 之和不超过 1 0 6 10^6 106,即 ∑ n ≤ 1 0 6 \sum n \leq 10^6 ∑n≤106。保证 0 ≤ x < 2 64 0 \leq x \lt 2^{64} 0≤x<264。
提示
- 请注意大量数据读入对程序效率造成的影响。
- 因为一开始数据造错了,请注意输出的
Empty
不含叹号,Anguei!
含有叹号。
题解思路
首先,本题最重要一点,题目中所用最大测试数据必须用unsigned long long
否则无法通过测试。
然后,咱们开始讲栈!
栈——最早的元素最后才能被访问,最后加进去的元素最先被访问。如图,元素只能从最顶上被加进去,也只能从最顶上取出元素。
C++中已经有写好的stack和vector数据结构,不过为了更好的理解它的原理,今天我使用的是数组来演示栈的常见操作。
栈初始是空的,大小为0,所以下标
i
i
i 一开始为
0
0
0。
向栈中添加元素,执行完后,
i
i
i 变为 1,也就表示,栈的大小为1。
当我们执行pop操作的时候,
i
i
i 的值减小。比如当栈中有4个元素时,
i
=
4
i=4
i=4 ,栈pop,下标左移
i
=
3
i=3
i=3 。
当我们执行query
时,返回下标为
i
i
i 的数组元素。如下图,所示,返回nums[i]
,即nums[3] -> 2
。
注意点:
- 如果是用数组实现的栈,向栈内添加元素时,要注意数组的大小,需要大于题目需要的最大情况。如果是用stack或vector实现的栈,它们会自动扩展空间大小。
- 执行pop操作的时候,正常情况就让
i--
,但是如果 i = 0 i = 0 i=0,此时栈内为空,无法再让栈顶元素出栈。 - 执行query操作,如果 i = 0 i = 0 i=0 ,此时栈内为空,无法获得栈顶元素的值。
- 执行size操作,我们约定的下标 i i i 即为栈的大小。
题解代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N = 1e6 + 1;
class MyStack
{
private:
int i = 0;
ll nums[N];
public:
void push(ll x)
{
if (i < N)
{
nums[i++] = x;
}
}
void pop()
{
if (i > 0)
{
i--;
}
else
{
printf("Empty\n");
}
}
void query()
{
if (i > 0)
{
printf("%llu\n", nums[i - 1]);
}
else
{
printf("Anguei!\n");
}
}
void size()
{
printf("%d\n", i);
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
MyStack stack;
while (n--)
{
string ord;
cin >> ord;
if (ord == "push")
{
ll x;
scanf("%llu", &x);
stack.push(x);
}
else if (ord == "pop")
{
stack.pop();
}
else if (ord == "query")
{
stack.query();
}
else if (ord == "size")
{
stack.size();
}
}
}
return 0;
}