栈-基础(基础内容)

课程大概

学习内容:

是一种后进先出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_pp 为最大下标。

这些都是可以手写出来,不过也可以用自带的,这里待会讲。

利用手写栈写出以上功能(数组);

x 压入栈顶,因为压入的是栈顶,所以要定义一个整型变量 p ,用于记录在数组最上面的数是什么,还要判断是否超过最大值,这里通常可以省略不写,因为栈是一个自由变大数组,输入的时候也不会超过数据范围。

int v[10005];
int p=0;//初始值为个数为 0 
void push(int x){
	cin>>x;//要压入的数 
	p++;//长度 +1,更新长度 
	a[p]=x;//将 x 压入栈顶 
}

弹出栈顶元素(删除),这里不是查找,我们只用把栈顶下标向下移一位,如果要输出的时候当 ip 的时候就停止循环: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 的元素的个数。

7 个赞

XYD的LeTeX要加空格

2 个赞

void为空,return ;返回值也为空。

1 个赞