目录
0.关于栈
栈是一个先进后出的数据容器。
栈是线性表,但只允许一段进行插入或删除。
像这样
就像一堆东西,你必须要先取出上面的,才可以再去取出下面的。
如上图,想要拿到2,就必须先拿1.
我们管这样叫做
FILO(First In Last Out)
或者
LIFO(Last In First Out)
如果我告诉你有一个栈,有ABCDEF六个元素,入栈顺序为ABCDEF,那么以下的出栈顺序可以吗?
CBEADF
ACEDBF
CBFEDA
BEDFAC
第一个显然不行,拿走E之后必须要拿走D才可以拿A。
第二个可以。
第三个也可以。
第四个要拿走C才可以拿A,也不行。
判断是否合法出栈序列代码(拿走不谢):
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int s[N],a[N];
int n,top,cur;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
top=0;
for(int i=1,cur=1;i<=n;i++){
while(cur<=a[i]) s[++top]=cur++;
if(s[top]==a[i]) --top;
else{
cout<<"NO";
return 0;
}
}
cout<<"YES";
return 0;
}
那么如果再告诉你,有一个栈,有ABCDEF六个元素,入栈顺序为ABCDEF。
假设出栈顺序是BCADFE,那栈的容量至少是多少?
————(请自行思考)————
1.stl栈
stl里面有很多数据容器,这些容器可以比数组模拟要方便很多。
栈在stl里面是stack,
使用前需要定义头文件 #include<stack>
栈的定义方式是这样的:stack<数据类型> 栈的名称;
比如要定义一个整数类型的栈,命名为stk,那么可以这样写:
stack<int> stk;
那么我们该怎么使用栈呢?
以下是基本的几个操作:
stk.push() →插入一个元素
stk.pop() →弹出一个(栈顶)元素
stk.size() →栈里目前的元素个数
stk.empty() →栈是否为空
stk.top() →获取栈顶元素
运行下面的代码:
#include<bits/stdc++.h>
#include<stack>
using namespace std;
stack<int> stk;
int main(){
stk.push(10);
stk.push(15);
stk.push(3);
stk.push(5);
for(int i=1;i<=4;i++){
cout<<"stk.size(): "<<stk.size()<<endl;
cout<<"stk.top(): "<<stk.top()<<endl;
stk.pop();
}
cout<<stk.empty();
return 0;
}
运行结果:
代码请自行理解,这里不多加解释。
2.练习
表达式括号匹配
加减算式
表达式求值
后缀表达式
整式的计算
严禁抄代码,代码自己写!!!
3.参考文献
https://cplusplus.com/reference/stack/stack/?kw=stack
STL常用容器用法大全_stl容器使用_星夜.秋声的博客-CSDN博客
那我们下期再见咯~