概要:本文主要讲述有关数据结构中“栈”的相关操作内容(使用c语言进行操作)
1.栈是个啥,相关概念及特点。
2.栈如何建立
3.如何操作栈,栈的部分用途。
栈是个啥,相关概念及特点。
- 栈的相关概念:
栈是一种操作受限的线性表,所受限制为:仅可在表尾进行插入删除。
栈顶是指线性表表尾。
栈底是指线性表的表头。 - 栈的特点:
先进后出是指栈中元素的进出顺序,先进栈的元素在出栈时会比后进栈的元素靠后。因为栈只能在栈顶进行插入和删除,例如元素a先进栈,现在栈顶元素为a,之后元素b进栈,栈顶元素就成了b,然后出栈的时候b先出栈,栈顶元素变成a,a才能出栈。
后进先出这其实就和先进后出相对应的了。
栈如何建立
- 利用数组:
借助数组作为栈的空间载体,然后定义对应的栈顶指针和栈底指针均指向数组的首地址即可。
下面以整形栈为例,建立一个有100个元素储存空间的栈
int stack[100];
int *base,*top; //base为栈底指针,top为栈顶指针
top=base=stack;
- 动态分配内存
提到动态分配内存,自然就需要借助malloc函数给栈分配空间了,先用栈底指针接受malloc函数返回的空间首地址,再让栈顶指针也指向这个首地址即可。
下面依旧以整形为例,先建立一个有100个元素储存空间的栈
int *base,*top; //base为栈底指针,top为栈顶指针
base=(int *)malloc(100*sizeof(int));
top=base;
- 栈的信息整合
由于一个栈含有三个基本信息:栈顶指针,栈底指针,栈的长度。
所以如果我们要对多个栈进行操作的话会导致不方便,变量名容易混淆,所以在建立栈的时候,通常会将一个栈的基本信息整合为一个结构体,这么一来,一个结构体也就表示一个栈。
是的我又要用整形开刀了
typedef struct Stack
{
int *base; //栈底指针
int *top; //栈顶指针
int size; //栈的长度
}stack;
如何操作栈,栈的部分用途
- 操作栈
入栈:将一个元素加入栈中,将其置于栈顶。令将要入栈元素赋值给栈顶指针所指空间,然后再将栈顶指针后移一位
出栈:将栈中元素移出。由于栈顶指针所指向位置是没有元素的,所以栈顶元素应为栈顶指针所指向空间的之前一位,即*(base-1)才是目前栈顶的第一个元素,将其带出使用之后,栈顶指针前移一位(此操作随不会删除原栈顶元素,但由于对栈进行操作的时候会默认忽略该栈顶指针所指向位置的元素,所以我们记该操作为,删除栈顶元素)。
下面以整形为例用代码和示意图分别展示入栈操作和出栈操作:
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack //定义栈的结构体
{
int *base; //栈底指针
int *top; //栈顶指针
int size; //栈的长度
}stack;
int main()
{
int a=1,b=2;
int c;
stack s; //创建初始栈
s.base =(int*)malloc(100*sizeof(int));
s.top=s.base;
*s.top++=a; //将a入栈
*s.top++=b; //将b入栈
while(s.base!=s.top) //逐个出栈,并输出
{
c=*(s.top-1);
s.top--;
printf("%d\t",c);
}
return 0;
}
- 栈的扩充
当栈满了以后我们就需要对其进行扩充了,下面代码演示对动态分配好的栈进行扩充,使用到了realloc函数
stack s;
if(s.top-s.base==s.size-1) //判断是否栈满
s.base=(int*)realloc(s.base,(s.stacksize+5)*sizeof(int)); //进行扩充,空间加5
s.size+=5; //相应的对栈的长度属性加5
- 栈的部分用途
栈可以是一个临时存储数据的地方,并且其会保有原数据的次序性。
比较实际的用处,比如可以在编程一个计算器时储存算术式里的数字与符号。
简易计算器算法详解:https://blog.csdn.net/weixin_44579240/article/details/89603800