一、算法描述

本篇文章讲述的数据结构是,栈,数组模拟栈。

栈的结构相信大家应该很清楚了,特点就是先进后出,只能在栈顶操作,栈底不能操作。

//用数组模拟的栈定义如下:
int tt;
int st[N];
/*
	tt表示栈顶(我习惯于表示栈顶的下一个位置,可以根据个人习惯来修改)
	st[N]表示栈
*/
  • 栈不是很难理解,相比于链表要简单很多,后面的队列和栈一样不是很难理解。

接下来介绍栈的各种操作:

初始化操作:

void init()
{
    tt = 0;	
}
  • 看个人习惯,我习惯于表示栈顶元素的下一个位置,如果是表示栈顶初始化应修改为 \(tt = -1\);

向栈中压入元素:

void push(int x)
{
    st[tt ++ ] = x;
    //st[++ tt ] = x;
}
  • 以上两种写法的区别就在于,第一种是先存储了 \(x\)\(tt\) 再加;而第二种是 \(tt\) 先加再存储 \(x\)
  • 主要就是个人习惯问题。

弹出栈顶元素:

void pop()
{
    -- tt;
}
  • 栈只能在栈顶操作,所以直接让栈顶指针减一即可。

判空:

bool empty()
{
    return tt == 0;
}
  • 直接判断栈顶指针是否为 \(0\) 即可。
  • 同样另一种情况就是 \(tt == -1\) 即可。

查询栈顶元素:

int query()
{
    return st[tt - 1];
}
  • 直接返回栈顶元素即可。
  • 另一种写法就是 \(st[tt]\) 即可。

栈和队列的问题都不是很难,主要还是要多应用,熟练掌握这些数据结构。

二、题目描述

实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 \(x\)
  2. pop – 从栈顶弹出一个数;
  3. empty – 判断栈是否为空;
  4. query – 查询栈顶元素。

现在要对栈进行 \(M\) 个操作,其中的每个操作 \(3\) 和操作 \(4\) 都要输出相应的结果。

输入格式

第一行包含整数 \(M\),表示操作次数。

接下来 \(M\) 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示栈顶元素的值。

数据范围

\(1≤M≤100000,\)
\(1≤x≤10^9\)
所有操作保证合法。

输入样例:

10
push 5
query
push 6
pop
query
pop
empty
push 4
query
empty 

输出样例:

5
5
YES
4
NO 

三、题目来源

AcWing算法基础课-828.模拟栈

四、源代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010;

int tt;
int st[N];

void init()
{
    tt = 0;
}

void push(int x)
{
    st[tt ++ ] = x;
}

void pop()
{
    -- tt;
}

bool empty()
{
    return tt == 0;
}

int query()
{
    return st[tt - 1];
}

int main()
{
    int m;
    cin >> m;
    
    init();
    
    while (m -- )
    {
        char s[10];
        cin >> s;
        
        int x;
        
        if (!strcmp(s, "push"))
        {
            cin >> x;
            push(x);
        }
        else if (!strcmp(s, "pop"))
        {
            pop();
        }
        else if (!strcmp(s, "empty"))
        {
            if (empty())    puts("YES");
            else    puts("NO");
        }
        else
        {
            cout << query() << endl;
        }
    }
    
    return 0;
}

热门相关:跟总裁假结婚的日子   青莲剑说   龙印战神   龙印战神   厨道仙途