【洛谷 B3614】【模板】栈 题解(栈+数组)

98 阅读3分钟

【模板】栈

题目描述

请你实现一个栈(stack),支持如下操作:

  • push(x):向栈中加入一个数 xx
  • pop():将栈顶弹出。如果此时栈为空则不进行弹出操作,输出 Empty
  • query():输出栈顶元素,如果此时栈为空则输出 Anguei!
  • size():输出此时栈内元素个数。

输入格式

本题单测试点内有多组数据
输入第一行是一个整数 TT,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 nn
接下来 nn 行,每行首先由一个字符串,为 pushpopquerysize 之一。若为 push,则其后有一个整数 xx,表示要被加入的数,xx 和字符串之间用空格隔开;若不是 push,则本行没有其它内容。

输出格式

对于每组数据,按照「题目描述」中的要求依次输出。每次输出占一行。

样例 #1

样例输入 #1

2
5
push 2
query
size
pop
query
3
pop
query
size

样例输出 #1

2
1
Anguei!
Empty
Anguei!
0

提示

样例 1 解释

对于第二组数据,始终为空,所以 popquery 均需要输出对应字符串。栈的 size 为 0。

数据规模与约定

对于全部的测试点,保证 1T,n1061 \leq T, n\leq 10^6,且单个测试点内的 nn 之和不超过 10610^6,即 n106\sum n \leq 10^6。保证 0x<2640 \leq x \lt 2^{64}

提示

  • 请注意大量数据读入对程序效率造成的影响。
  • 因为一开始数据造错了,请注意输出的 Empty 不含叹号,Anguei! 含有叹号。

思路

首先定义一个全局的无符号长整型数组stk作为栈,top变量记录栈顶的位置。push函数实现入栈操作,将输入的元素x放入栈顶位置,并更新栈顶位置。pop函数实现出栈操作,将栈顶元素出栈,并更新栈顶位置。如果栈为空,输出"Empty"。query函数查询栈顶元素,如果栈为空,输出"Anguei!",否则输出栈顶元素。size函数输出栈的大小,即栈顶位置。clear函数清空栈,将栈顶位置设为0。

main函数中,从输入中读取测试用例的数量t。对于每一个测试用例,首先清空栈,然后读取操作的数量n。对于每一个操作,读取操作的种类op。如果op是"push",则读取一个元素x,并调用push函数将其入栈。如果op是"pop",则调用pop函数将栈顶元素出栈。如果op是"query",则调用query函数查询栈顶元素。如果op是"size",则调用size函数查询栈的大小。

注意:x 的值可能会很大,所以要用 unsigned long long,否则无法通过部分测试点。


AC代码

#include <iostream>
#include <stack>
#define ull unsigned long long
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e7 + 7;

stack<ull> stk;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int t;
	cin >> t;
	while (t--) {
		while (stk.size()) {
			stk.pop();
		}
		int n;
		cin >> n;
		while (n--) {
			string op;
			cin >> op;
			if (op == "push") {
				ull x;
				cin >> x;
				stk.push(x);
			} else if (op == "pop") {
				if (stk.size()) {
					stk.pop();
				} else {
					cout << "Empty" << endl;
				}
			} else if (op == "query") {
				if (stk.size()) {
					cout << stk.top() << endl;
				} else {
					cout << "Anguei!" << endl;
				}
			} else if (op == "size") {
				cout << stk.size() << endl;
			}
		}
	}
}