课程大概
学习内容:栈。
栈是一种后进先出( Last\,In\,First\,Out,LIFO )的线性表,就像生活中的洗盘子,先放入得盘子后洗,在学习栈之前先得做一个模拟洗盘子的程序。
手写栈
栈里自带的功能有很多:
以下为手写栈,非自带函数。
void push(x);
将 x 压入栈,相当于数组的输入 a_{i+1} , i 为输入之前数组 a 的最大下标。cin>>a[i]=a.push(x);
void pop();
弹出栈顶元素(删除),相当于数组的 a_i=0 ,在栈上可以做出真正意义上的删除,在数组中只能用特殊值( 0,-1 等不会出现的数)代替(读到特殊符就视为删除)。int top();
查询栈顶元素,相当于数组的 a_p , p 为最大下标。
这些都是可以手写出来,不过也可以用自带的,这里待会讲。
利用手写栈写出以上功能(数组);
将 x 压入栈顶,因为压入的是栈顶,所以要定义一个整型变量 p ,用于记录在数组最上面的数是什么,还要判断是否超过最大值,这里通常可以省略不写,因为栈是一个自由变大数组,输入的时候也不会超过数据范围。
int v[10005];
int p=0;//初始值为个数为 0
void push(int x){
cin>>x;//要压入的数
p++;//长度 +1,更新长度
a[p]=x;//将 x 压入栈顶
}
弹出栈顶元素(删除),这里不是查找,我们只用把栈顶下标向下移一位,如果要输出的时候当 i 到 p 的时候就停止循环:for(int i=1;i<=p;i++);
最后还要考虑栈为空栈,到空栈就不能删除,这样等用自带函数的时候就会爆栈,即俗称的 RE。
void pop(){
if(p>=1)p--;
}
当 v 数组可以删除的时候删除。
当然函数里也可以写成这样:p=max(1,p-1);
:无脑减,小于 1 (最小值)就设为 1 。
输出栈顶元素,这里直接无脑输出,不用考虑越界:
void top(){
cout<<v[p]<<endl;
}
运用以上知识点可以写出以下功能:
- 查询站内的个数;
- 输出栈的第 x 个元素;
- 判断栈是否为空;
查询栈内的个数可以直接输出 p ,因为 p 代表栈内的个数。
void size(){
cout<<p<<endl;
}
输出站内第 x 个元素只用输出 v_x 就行,在这里第 i 个数下标是 i ,所以不用考虑下标为 0 的情况,如果下标为 0 可以直接输出 v_{p-1} 。
这里因为自带函数的栈**好像(也可能是没学到)**没有这个功能,没有官方因为字母,所以用 yuansu_x
代替:
void yuansu_x(){
cin>>x;
cout<<v[x]<<endl;
}
查询栈是否为空栈只用判断下表是否为 0 ,如果为 0 则代表没有数,所以是空栈。
void query(){
if(p==0)cout<<"Anguei!"<<endl;
}
到这里手写栈的内容基本就完成了。
c++ 内部自带函数栈
stack<int>v;
:定义一个可以相对无限延长的整型栈。
v.push(x);
:将元素 x 压入栈(输入进栈里)并增加长度。
v.pop();
:将栈顶元素弹出,没有元素会爆栈(RE)。
v.top();
:查询站定元素,例:cout<<v.top(); -> 3
。
v.size();
:查询栈 v 的元素的个数。