【数据结构】栈和队列

发布于:2025-03-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

1.栈

1.1栈的概念和结构

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO (Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

 

1.2栈的实现(C)

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

用数组来实现一个栈:

用链表来实现一个栈:

  

定义一个栈

a 是指向动态开辟的数组指针

top 是栈顶元素的下一个位置的下标(也可以是栈顶元素的下标)

cacpcity 是栈的最大容量 

要实现的接口:

 一、栈初始化函数

二、栈删除函数

三、压栈函数

四、判断栈是否为空函数

为什么判断栈是否为空还要写一个函数呢?直接 if(ps->top == 0) 不行吗?原因是:写一段代码可能由多个人来完成,top 的含义可能有歧义,所以才写一个函数来判断栈是否为空,并且函数名 STEmpty 增加了可读性。

五、出栈函数

可以将栈顶元素作为返回值  

六、返回栈顶元素函数

七、栈打印函数

注意:要访问栈的元素,只能从栈顶开始访问,如果要访问栈顶之下的函数,要将栈顶元素出栈。

2.队列

2.1队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2.2队列的实现(C)

仍然用单向不循环链表实现队列,为方便出队列和入队列,在链表的头结点和尾结点分别用 head 指针和 tail 指针指向它们。

一、定义队列的结点

二、定义队列

为什么不直接定义 head 和 tail 指向队列的头和尾呢?原因是:如果这样做,每次使用函数来使结点入队列或出队列都要传 head 和 tail 作为参数,并且还要传它们的二级指针,如果我们将 head 和 tail 封装成一个结构体,那函数的参数就只要一个结构体就行了。

定义的队列中还有 size 变量,它存储队列中结点的个数。

结构梳理:

要实现的接口:

三、队列初始化函数

四、队列删除函数

五、入队列函数

六、出队列函数 

 注意:

1、要检查队列是否为空

2、若队列只有一个结点,也要特殊处理

3、可以将对头元素作为返回值。

七、求队列元素个数函数

八、判断队列是否为空函数

九、取对头对尾元素函数 


网站公告

今日签到

点亮在社区的每一天
去签到