山东中医药大学计算机科学与技术2班王鑫童第3章笔记

本文详细介绍了栈与队列的概念、基本操作及其在不同场景的应用,包括两栈共享空间的实现、顺序栈与链栈的区别、循环队列与链队列的特点,以及如何通过方法一至方法三确定队空和队满的判定条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈与队列

栈:限定仅在表的一端进行插入和删除操作的线性表.
允许插入和删除的一端称为栈顶,另一端称为栈底。
空栈:不含任何数据元素的栈。
注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。
栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系.
两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸。
两栈共享空间的实现——插入
操作接口:void Push(int i, DataType x) ;
1. 如果栈满,则抛出上溢异常;
2. 判断是插在栈1还是栈2;
       2.1 若在栈1插入,则
             2.1.1 top1加1;
             2.1.2 在top1处填入x;
       2.2 若在栈2插入,则
             2.2.1 top2减1;
             2.2.2 在top2处填入x;
两栈共享空间的实现——删除
操作接口:DataType Pop(int i) ;
1. 若是在栈1删除,则
     1.1 若栈1为空栈,抛出下溢异常;
     1.2 删除并返回栈1的栈顶元素;
2. 若是在栈2删除,则
     2.1 若栈2为空栈,抛出下溢异常;
     2.2 删除并返回栈2的栈顶元素;
顺序栈:有元素个数的限制和空间浪费的问题。
链栈:没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。
总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。
假溢出:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做假溢出。
如何确定不同的队空、队满的判定条件?
为什么要将队空和队满的判定条件分开?
方法一:附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满;
方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;
方法三:设置标志flag,当front=rear且flag=0时为队空,当front=rear且flag=1时为队满。
循环队列和链队列的基本操作都需要常数时间O
循环队列:必须预先确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。
链队列:没有队列满的问题,只有当内存没有可用空间时才会出现队列满,但是每个元素都需要一个指针域,从而产生了结构性开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值