一个初学者对栈的理解

一个初学者对栈的理解


16340168

中山大学数据科学与计算机学院

  • 一个初学者对栈的理解
    • 中山大学数据科学与计算机学院
    • 一什么是栈
    • 二栈的基本操作
      • 1入栈push
      • 2出栈pop
    • 三两种常用的栈
      • 1顺序栈
      • 2链式栈
    • 四实现步骤
      • 1定义栈结构
      • 2初始化栈
      • 3入栈操作
      • 4出栈操作
      • 5获取栈顶元素
      • 6释放内存
    • 五实际应用


一、什么是栈?

这篇文章所言的栈是一种数据结构,不要与栈区混淆。数据结构中的栈是一种线性表,特点是只允许在表头进行数据的插入和删除,也就是数据遵循先进后出的原则,一般把一端称为栈顶(top),另一端称为栈底(base)。

一个初学者对栈的理解_第1张图片

二、栈的基本操作

对栈的基本操作只有两种,一种是入栈(push),一种是出栈(pop)。

1、入栈(push)

即将数据保存在栈顶,操作前先将栈顶(top)指针移向下一个位置,从图里看就是将top箭头上移,之后将数据保存在指针所指位置。

2、出栈(pop)

即将保存在栈顶的数据输出,然后修改栈顶指针使之移向上一个位置,从图里看就是将top箭头下移。


三、两种常用的栈

1、顺序栈

使用连续的内存空间模拟栈的空间,一般使用数组来实现,数组索引为0即为栈底,其次再定义一个变量储存栈顶位置即可,这种栈实现起来比较简单容易操作,适合初学者。

2、链式栈

使用零散的内存空间模拟栈的空间,一般使用链表1来实现,链表尾部即为栈底,链表头部即为栈顶。


四、实现步骤

1、定义栈结构

定义栈这里定义一个结构体
(我左括号就是不换行你打我呀

typedef struct stack {
  int *base;
  int *top;
} Stack;

2、初始化栈

为栈申请内存空间

void initStack(Stack *Sta) {
  Sta->base = (int *) malloc(100 * sizeof(int));//这里申请了100个int的大小 可以根据需求更改
  Sta->top = Sta->base;
}

3、入栈操作

入栈之前介绍过,就是存储数据了。
(保险起见这里可以加个扩大栈空间的机制…我就偷个懒吧

void push(Stack *Sta, int ele) {
  Sta->top++;
  *(Sta->top) = ele;
}

4、出栈操作

出栈也一样,但值得一提的是出栈需要判断栈是否已空(我再偷个懒
因为之前定义时用到的是int类型 所以返回值也是int

int pop(Stack *Sta) {
  int temp;
  temp = *(Sta->top);
  Sta->top--;
  return temp;
}

(不知道这里用temp是不是好的选择,不过我是菜鸡就是了…

5、获取栈顶元素

这个比较简单 返回top所指元素就行了(偷个懒吧

6、释放内存

申请的内存空间都需要释放,不然会引起内存泄漏,栈当然一样。

void freeStack(Stack *Sta) {
  free(Sta);
}

(本来这里也想偷个懒的,但是管理内存是一个很重要的习惯!
如果是小程序,不释放内存的话后果或许不会很严重,然而以后进行工作的时候,那种看似良好运行的程序却可能由于内存泄漏在某一天突然坍塌,造成这种后果

1=0

还可能被炒鱿鱼,所以从现在养成好习惯吧!

五、实际应用

实际应用很多啊,比如题库里的括号配对就很适合用栈呀!

PS:不知道有没有地方出错了,若有,本鶸求大佬指导。


  1. 一种类似数组,却在物理存储单元上非连续、非顺序的存储结构。 ↩

你可能感兴趣的:(作业)