「学习笔记」栈
栈是一种特殊的线性表,其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。
显然,由于只能对一端进行操作,栈中的元素是先进后出的。
栈的写法:
- 手写栈
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];
}
- STL
stack<int>s; //参数也是数据类型,这是栈的定义方式
s.empty() //如果栈为空返回1,否则返回0
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素但不返回其值
s.top() //返回栈顶的元素,但不删除该元素
s.push(X) //在栈顶压入新元素 ,参数X为要压入的元素
栈的应用
-
表达式求值
给定一个表达式,求表达式的值或其他东西,是一个比较常见的栈的应用。
一般利用栈先进后出的性质,从左往右扫一遍表达式,以便于满足计算的优先级。
例题:luoguP1981 表达式求值。
-
前缀表达式,中缀表达式,后缀表达式の相互转换
这个也是栈的经典应用,本质上和表达式求值是差不多的。
-
辅助栈
顾名思义,一个栈不够用了,需要更多的栈辅助。
常常是需要记录原栈中数的一些信息,而原栈无法实现,如最大值最小值,所以需要新开额外的辅助栈辅助记录信息。
-
单调栈
单调栈内元素保证单调性,常用来维护一个数前/后第一个大/小于它的数。

浙公网安备 33010602011771号