「学习笔记」栈

栈是一种特殊的线性表,其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。

显然,由于只能对一端进行操作,栈中的元素是先进后出的。

栈的写法

  1. 手写栈
int s[N],sz;    //s[i]表示栈中从下往上数第i个数的值,N表示栈的大小,sz表示当前栈中元素数量
void push(int x){    //压入一个新元素x 
    sz++;
    s[sz]=x; 
    //栈中元素数量加1,值为x 
}
void pop(){    //弹出栈顶元素 
    sz--;
    //只要将栈中元素数量减1就好了,原本栈顶元素的值会被后来新加的覆盖 
}
int top(){    //求栈顶元素 
    return s[sz];
}
  1. STL
stack<int>s;    //参数也是数据类型,这是栈的定义方式
s.empty()    //如果栈为空返回1,否则返回0
s.size()    //返回栈中元素的个数
s.pop()    //删除栈顶元素但不返回其值
s.top()    //返回栈顶的元素,但不删除该元素
s.push(X)    //在栈顶压入新元素 ,参数X为要压入的元素

栈的应用

  1. 表达式求值

    给定一个表达式,求表达式的值或其他东西,是一个比较常见的栈的应用。

    一般利用栈先进后出的性质,从左往右扫一遍表达式,以便于满足计算的优先级。

    例题:luoguP1981 表达式求值

  2. 前缀表达式,中缀表达式,后缀表达式の相互转换

    这个也是栈的经典应用,本质上和表达式求值是差不多的。

    例题:luoguP1175 表达式的转换

  3. 辅助栈

    顾名思义,一个栈不够用了,需要更多的栈辅助。

    常常是需要记录原栈中数的一些信息,而原栈无法实现,如最大值最小值,所以需要新开额外的辅助栈辅助记录信息。

    例题:ACwing41 包含min函数的栈

  4. 单调栈

    单调栈内元素保证单调性,常用来维护一个数前/后第一个大/小于它的数。

    例题:luoguP5788 【模板】单调栈

posted @   Yikuwa  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示