【洛谷】B3614 【模板】栈 题解——通过模板讲解栈

【模板】栈

栈 模板

题目描述

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

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

输入格式

本题单测试点内有多组数据
输入第一行是一个整数 T T T,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 n n n
接下来 n n n 行,每行首先由一个字符串,为 pushpopquerysize 之一。若为 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 解释

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

数据规模与约定

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

提示

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

题解思路

首先,本题最重要一点,题目中所用最大测试数据必须用unsigned long long否则无法通过测试。
然后,咱们开始讲栈!

栈——最早的元素最后才能被访问,最后加进去的元素最先被访问。如图,元素只能从最顶上被加进去,也只能从最顶上取出元素。
【洛谷】B3614 【模板】栈 题解——通过模板讲解栈_第1张图片
C++中已经有写好的stack和vector数据结构,不过为了更好的理解它的原理,今天我使用的是数组来演示栈的常见操作。
栈初始是空的,大小为0,所以下标 i i i 一开始为 0 0 0
【洛谷】B3614 【模板】栈 题解——通过模板讲解栈_第2张图片
向栈中添加元素,执行完后, i i i 变为 1,也就表示,栈的大小为1。
【洛谷】B3614 【模板】栈 题解——通过模板讲解栈_第3张图片
当我们执行pop操作的时候, i i i 的值减小。比如当栈中有4个元素时, i = 4 i=4 i=4 ,栈pop,下标左移 i = 3 i=3 i=3
【洛谷】B3614 【模板】栈 题解——通过模板讲解栈_第4张图片
当我们执行query时,返回下标为 i i i 的数组元素。如下图,所示,返回nums[i],即nums[3] -> 2
【洛谷】B3614 【模板】栈 题解——通过模板讲解栈_第5张图片
注意点:

  • 如果是用数组实现的栈,向栈内添加元素时,要注意数组的大小,需要大于题目需要的最大情况。如果是用stack或vector实现的栈,它们会自动扩展空间大小。
  • 执行pop操作的时候,正常情况就让i--,但是如果 i = 0 i = 0 i=0,此时栈内为空,无法再让栈顶元素出栈。
  • 执行query操作,如果 i = 0 i = 0 i=0 ,此时栈内为空,无法获得栈顶元素的值。
  • 执行size操作,我们约定的下标 i i i 即为栈的大小。

题解代码

#include 
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;
}

你可能感兴趣的:(#,洛谷,算法)