- 1、本文档共52页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DS03-栈和队列
第三章 栈和队列 栈(Stack) 栈的应用 队列(Queue) 队列的应用 定 义 栈的基本操作 InitStack(S): 构造一个空栈S ClearStack(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; /*p为指向链队列结点的指针*/ datatype x; ? if (Q-front == Q-rear) {printf(队列为空,无法删除!); return FALSE;} ? ? else {p = Q-front-next; /*p指向链队列的队头结点*/ x = p-data; /*将队头元素的值赋给变量x*/ Q-front-next = p-next; /*出队列,修改队头指针*/ if(Q-rear == p) { Q-rear=Q-front;Q-rear-next=NULL;} /*若出队列后队列为空, 则还应当修改队尾指针,使队尾指针指向头结点*/ ? ?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) % MAXSIZE 循环队列长度为:L=(rear-front +MAXSIZE)% MAXSIZE J2 J3 J1 J4 J5 front rear 解决办法:少用一个元素空间,约定以“队头指针在队尾指针的下一位置(指环状的下一位置)”作为队列“满”的标志。也就是说,若数组的大小是MAXSIZE,则该数组所表示的循环队列最多允许存储MAXSIZE-1个结点。注意: rear所指的结点始终为空。 循环队列满的示意图: 经过约定后的循环队列操作示意图 (p.70,图3.13改) 循环队列的基本操作实现 以创建队列、入队和出队三种基本操作为例 1、构造(初始化)一个空队列 算法要求:生成一空队列 算法步骤: ①为队列分配存储空间; ②设置队列为空队列,其特征为: front=rear=0 构造一个空队列q 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)入队动作
您可能关注的文档
- deep与deeply, close与closely, high与highly等的用法区别.ppt
- DELL服务器 RAID配置中文手册.pdf
- delonghi咖啡机和进口欧蒂玛商用咖啡机价格.docx
- Delphi串口通信编程.ppt
- Dev-C++简明教程.ppt
- DELL D630彻底拆机清灰教程.doc
- HL 销售培训资料 BIC 1 - 58 slides.pdf
- DIY安卓手机动态壁纸APK安装文件制作教程.pdf
- DISC 性格测试.pptx
- DLP清洁技巧.doc
- 2024-2025学年初中英语七年级下册牛津上海(试用本)教学设计合集.docx
- 高校教师资格证之《高等教育法规》通关考试题库附参考答案详解(模拟题).docx
- 农业现代化2025:可持续种植技术模式创新与市场拓展分析报告.docx
- 社区老年大学远程教育2025年资源整合与教育质量监控体系构建报告.docx
- 高校教师资格证之《高等教育法规》通关考试题库附参考答案详解(研优卷).docx
- 2025年跨境电商床上用品供应链跨境电商物流机器人技术应用.docx
- 面向2025年工业互联网平台开发的风险评估与生态构建技术创新报告.docx
- 农业现代化背景下2025年乡村振兴人才培养体系建设报告.docx
- 农业物联网技术推动2025年精准农业装备研发与应用报告.docx
- 高校教师资格证之《高等教育法规》通关考试题库附答案详解ab卷.docx
文档评论(0)