数据结构——C语言描述 王国钧 主编 唐国民 苏晓萍 马瑜 副主编 DS03-栈和队列新.pptVIP

数据结构——C语言描述 王国钧 主编 唐国民 苏晓萍 马瑜 副主编 DS03-栈和队列新.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 栈和队列 栈(Stack) 栈的应用 队列(Queue) 队列的应用 定义 栈的基本操作 ClearStack(S): 清除栈S中的所有元素 InitStack(S): 构造一个空栈S StackEmpty(S):判断栈S是否为空,若为空,则返回 true;否则返回false GetTop(S) : 返回S的栈顶元素,但不移动栈顶指针 Push(S, x) :插入元素x为新的栈顶元素(入栈操作) Pop(S) : 删除S的栈顶元素并返回其值(出栈操作) 顺序栈的基本操作 顺序栈的入栈操作——例如用堆栈存放(A,B,C,D) 顺序栈出栈操作——例如从栈中取出‘B’ 链栈的入栈操作和出栈操作 3.2 栈的应用举例 3.3 队列 队的实现方式是本节重点,关键是掌握入队和出队操作。 具体实现依存储结构(链队或顺序队)的不同而不同。 链队列 datatype DeQueue(LinkQueue *Q) ?{ Qnode *p; datatype x; ?if (Q-front == Q-rear) {printf(队列为空,无法删除!); return FALSE;} ? ? p = Q-front-next; x = p-data; Q-front-next = p-next; if(Q-rear == p) Q-rear=Q-front;? ?free(p); ? return x; } 链队出队操作 顺序队类型定义: #define MAXSIZE 100 /* 最大队列长度 */ typedef struct { datatype data[MAXSIZE]; /* 存储队列的数据空间 */ int front; /* 队头指针,若队列不空,则指向队头元素 */ int rear; /* 队尾指针,若队列不空,则指向队尾元素的下一个位置 */ }SeqQueue; 顺序队的几种状态示意图 入队操作: rear=(rear+1)%Maxsize 出队操作: front=(front+1)%Maxaize 新问题:在循环队列中,空队特征是front=rear;队满时也会有front=rear;判决条件将出现二义性! 循环队列示意图 循环队列的几种状态 队空条件 : front = =rear (初始化时:front = rear ) 队满条件: front == (rear+1) % N (N=maxsize) 队列长度(即数据元素个数):L=(N+rear-front)% N J2 J3 J1 J4 J5 front rear 解决方案-----------人为浪费一个单元: 即front和rear二者之一指向实元素,另一个指向空闲元素(假设front指向队头元素,rear指向队尾元素的下一个位置)。 6 5 循环队列的基本操作实现 以建队、入队和出队三种基本操作为例 1)初始化一个空队列 算法要求:生成一空队列 算法操作:为队列分配基本容量空间 设置队列为空队列,其特征即: front=rear=0(也可为任意单元,如1,2,…甚至-1 ) 建队的完整算法 SeqQueue *InitQueue() { SeqQueue *q; q=(SeqQueue*)malloc(sizeof(SeqQueue)); /* 开辟一个足够大的存储队列空间 */ q-front = q-rear = 0; /* 将队列头尾指针置为零 */ return q; /* 返回队列的首地址 */ } 算法说明:向循环队列的队尾插入一个元素 分 析: (1) 插入前应当先判断队列是否满? if (( q -rear + 1 ) % Maxsize )==q-front) return false; (2)插入动作 q-data [q-rear] = x; q-rear = ( q -rear + 1 ) % Maxsize; 入队操作 队列尺寸 出队操作 算法说明:删除队头元素,返回其值 x 分 析: (1) 在删除前应当判断队列是否空? if (q-front = q-rear ) return false; (2)删除动作分析; 前面约定指针front指向队首元素的位置,故: x= q-data [ q-front ] ; q-front

您可能关注的文档

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档