版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章栈和队列学时分配:4学时3.1栈3.1.1栈的定义及运算 3.1.2顺序栈及运算的算法实现3.1.3链栈及运算的算法实现3.1.4栈的应用3.1.5栈与递归3.2队列3.2.1队列的定义及运算3.2.2顺序队列及运算的实现3.2.3链队列及运算的实现3.3栈与队列的比较2【学习目标】理解栈和队列的概念、运算特点。掌握栈和队列的存储以及运算的实现。理解栈和队列在解决实际问题中的应用。综合运用栈或队列解决实际应用问题。【思维导图】
3.1.1栈的定义及运算
1.定义:栈(stack)是运算受限的线性表,限制它的插入和删除操作仅在表的一端进行。栈是后进先出的线性表(lastinfirstout),简称LIFO表
2.术语:栈顶(top),栈顶元素,栈底(bottom),空栈,进栈或入栈,出栈或退栈。
3.栈的运算的实例
3.1栈3.栈的基本运算有五种:(1)初始化栈initStack(s):构造了一个空栈s。(2)判栈空empty(s):若栈s为空栈,返回值为“真”(1),否则返回值为“假”(0)。(3)入栈push(s,x):在栈s的顶部插入一个新元素x,
x成为新的栈顶元素。(4)出栈pop(s):删除栈s的栈顶元素。(5)读栈顶元素top(s):栈顶元素作为结果返回,不改变栈的状态。4.栈的存储
(1)采用顺序方式存储的栈称为顺序栈(sequentialstack)
(2)
采用链接方式存储的栈称为链栈(linkedstack)1.顺序栈用C语言描述如下:3.1.2顺序栈及运算的算法实现
#defineMAXSIZE1024 /*栈可能达到的最大容量*/typedefintDataType;typedefstruct{DataTypedata[MAXSIZE];inttop;}SeqStack;SeqStack*s; /*定义s是一个指向顺序栈的指针*/栈的操作及栈顶指针变化情况2.在顺序栈上实现五种基本运算的C函数(1)初始化栈首先建立栈空间,然后初始化栈顶指针。eqStack*initSeqStack(){SeqStack*s;s=(SeqStack*)malloc(sizeof(SeqStack));s->top=-1;returns;}(2)判栈空intempty(SeqStack*s){if(s->top==-1)return1;elsereturn0;}(3)入栈intpush(SeqStack*s,DataTypex){if(s->top==MAXSIZE-1)/*栈满不能入栈*/{ printf("overflow");return0;}s->top++;s->data[s->top]=x;return1;}(4)出栈voidpop(SeqStack*s)/*设栈不空*/{s->top--;}(5)读栈顶元素DataTypetop(SeqStack*s)/*设栈不空*/{ return(s->data[s->top]);}链栈用C语言描述如下:3.1.3链栈及运算的实现
typedefintDataType;typedefstructNode{DataTypedata;structNode*next;}LinkStack;LinkStack*top;/*top为栈顶指针*/【例3.1】将一个十进制正整数N转换成r进制的数。
NN/8(整除)N%8(求余)
18352293低
2292852834303高3.1.4栈的应用
转换算法中的主要步骤如下:(1)当N≠0时,将N%r存入栈s中,然后用N/r代替N,直到N=0退出循环。(2)只要栈s不空,就读出栈顶元素输出并把栈顶元素出栈。【例3.2】算术表达式中括号匹配的检查用栈来实现括号匹配检查的原则是,对表达式从左到右扫描。(1)当遇到左括号时,左括号入栈;(2)当遇到右括号时,首先检查栈是否空,若栈空,则表明该“右括弧”多余;否则比较栈顶左括号是否与当前右括号匹配,若匹配,将栈顶左括号出栈,继续操作;否则,表明不匹配,停止操作。(3)当表达式全部扫描完毕,若栈为空,说明括号匹配,否则表明“左括弧”有多余的。递归:函数、过程或数据结构等对象在其定义的内部直接或间接出现了对自身的引用是一种递归。递归函数:一个函数在其定义的内部直接调用自身,这个函数就叫做直接递归函数。3.1.5栈与递归longfact(intn){longf;if(n==0)f=1;elsef=n*fact(n-1);returnf;}main(){longm;intn=3;m=fact(n);printf(“%d!=%d\n”,n,m);}递归调用过程中栈及栈中数据的变化状况递归函数转换为非递归函数longfact2(intn)/*用栈实现非递归的阶乘运算*/{SeqStack*s;longf=1;inti=n;s=initSeqStack();while(i>0){push(s,i);i--;}while(!empty(s)){ i=top(s); f=f*i; pop(s);}returnf;}时间复杂度和空间复杂度都为O(n)递归函数的完成需要借助于一个系统栈来保存中间结果。实际上,用户也可以在算法中设置栈来模拟系统栈的作用,从而将递归函数转换为非递归函数。1.定义:只允许在表的一端进行插入,而在表的另一端进行删除,将这种线性表称为队或队列(queue)。2.术语:队尾(rear),队头(front),入队或进队,离队或出队,空队列
队尾元素,队头元素3.在队列中,元素出队的顺序必然与其进入队列的顺序是一致的,最先进入的元素最先离开,所以队列又叫先进先出的线性表,简称为FIFO(FirstInFirstOut)表。4.队列的应用队列图示a1a2a3a4a5
入队出队3.2队列3.2.1队列的定义及运算5.在队列上进行的基本运算(1)队列初始化initQueue(q):构造一个空队列。(2)判队空emptyQueue(q):若q为空队则返回为1,否则返回为0。(3)入队enQueue(q,x):对已存在的队列q,插入一个元素x到队尾,队发生变化。(4)出队deQueue(q,x):删除队头元素,并通过x返回其值,队发生变化。(5)读队头元素frontQueue(q):读队头元素,并返回其值,队不变。采用顺序方法存储的队列称为顺序队列(sequentialqueue)顺序队列的存储结构用c语言定义如下:#defineMAXSIZE1024 /*队列的最大容量*/typedefintDataType;typedefstruct{DataTypedata[MAXSIZE]; /*队员的存储空间*/intrear,front; /*队头队尾指针*/}SeQueue;SeQueue*sq;/*定义一个指向队列的指针变量*/
3.2.2顺序队列及运算的实现
入队、出队时头尾指针及队列中元素之间的关系入队操作:
sq->rear=sq->rear+1;sq->data[sq->rear]=x;/*把x写入队尾位置*/出队操作:
sq->front=sq->front+1;x=sq->data[sq->front];/*把出队元素值赋给x*/队空:sq->rear==sq->front时队中元素的个数:m=(sq->rear)-(sq->front)循环队列解决假溢出的方法之一是将队列的数据区假想成一个头尾相接的环形结构,即sq->data[0]紧接在sq->data[maxsize-1]之后。在循环队列中,头尾指针的关系不变,进行入队、出队操作时,头尾指针顺时针方向移动队空情况下还是在队满情况下均有sq->front=sq->rear,也就是说“队满”和“队空”的条件是相同的,出现这种情况显然是不允许的。解决方法有两种:一种是附设一个标志变量以区别是队空还是队满,例如可以设存储队列中元素个数的变量num,当num=0时队空,当num=maxsize时为队满。另一种方法是在循环队列中少用一个元素空间。循环队列操作指针变化情况
入队:sq->rear=(sq->rear+1)%MAXSIZE;出队:sq->front=(sq->front+1)%MAXSIZE;判断队满的条件:(sq->rear+1)%MAXSIZE==sq->front;队列中元素的个数为:M=(sq->rear-sq->front+MAXSIZE)%MAXSIZE;队空:sq->front==sq->rear采用链接方法存储的队列称为链队列(linkedqueue)采用带头结点的单链表来实现链队列,链队列中的结点类型与单链表相同。将头指针front和尾指针rear封装在一个结构体中,链队列用C语言描述如下:typedefstructNode{DataTypedata;structNode*next;}LQNode; /*链队列结点的类型*/typedefstruct{LQNode*front,*rear;}LQueue;/*将头尾指针封装在一起的链队列*/LQueue*q;/*定义一个指向链队列的指针*/3.2.3链队列及运算的实现
还有一种更简单的链队列实现方法,就是用设尾指针的带头结点的单循环链表来存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026诺基亚手机市场占有率下跌与智能设备技术创新竞争策略分析报告
- 2026区块链技术应用金融科技创新竞争分析报告
- 2026皮革制品行业现状与供需关系及未来产业投资评估规划
- 2026配电设备行业市场深度调研及趋势前景与投融资研究报告
- 2026中国运动防护产品跨境电商选品策略与海外仓布局研究报告
- 2026中国网络营销行业市场竞争与广告投放策略分析报告
- 2026人工智能领域政策影响与产业竞争格局现状研究分析规划报告
- 2026智能建筑能源管理系统节能效果与投资回报分析报告
- 无纺阻水带:从传统电缆辅材走向高规格阻水系统无纺阻水带迎来多场景升级
- 2026中国乡村振兴产业基金会特色项目培育策略报告
- 中医护理技术问答题库及答案解析
- 早产儿喂养不耐受的护理
- 【2025】焊工作业人员职业技能考试笔试试题(300道)及答案
- 输电线路500kv课件
- 剪映课件剪辑教学
- 潜水线课件教学课件
- 农房安全知识培训课件
- 胡桃夹综合征的超声诊断
- TCQAQI 8702-2023防静电环氧地坪系统施工及验收规范
- T-CAEPI 102-2025 重金属污染土壤稳定化工程技术指南
- 高中化学培训课件
评论
0/150
提交评论