第4章栈-队列PPT格式课件下载.ppt
- 文档编号:14024516
- 上传时间:2022-10-17
- 格式:PPT
- 页数:110
- 大小:1.57MB
第4章栈-队列PPT格式课件下载.ppt
《第4章栈-队列PPT格式课件下载.ppt》由会员分享,可在线阅读,更多相关《第4章栈-队列PPT格式课件下载.ppt(110页珍藏版)》请在冰豆网上搜索。
top=0满栈:
top=stacksize,顺序栈中数据元素和栈顶指针之间的对应关系:
栈空,一个元素入,栈满,建立空栈intInitStack(SqStack&
S)S.top=0;
returnOK;
(2)操作:
进栈,intPush(SqStackreturnOK;
intGetTop(SqStackS,ElemType&
e)/若栈不空,则用e返回s的栈顶元素,并返回OK;
/否则返回ERRORif(S.top=0)returnERROR;
elsee=S.dataS.top-1;
取栈顶元素,intpop(SqStackS,ElemTypereturnOK;
出栈,判断栈空,intIfEmpty(SqstackS)if(S.top=0)returnTRUE;
elsereturnFALSE;
顺序栈的动态类型表示:
#defineSTACK_INIT_SIZE100;
#defineSTACKINCREMENT10;
typedefcharElemType;
typedefstruct/顺序栈定义ElemType*base;
/栈底指针ElemType*top;
/栈顶指针intstacksize;
/当前已分配的全部存储空间SqStack;
顺序栈中数据元素和栈顶指针之间的对应关系:
栈空,一个元素入,栈满,判栈空intStackEmpty(SqStackS)if(S-top=S-base)return1;
/判栈空,空则返回1elsereturn0;
/否则返回0判栈满intStackFull(SqStackS)if(S-topS-base=S-StackSize)return1;
/判栈满,满则返回1elsereturn0;
/否则返回0,顺序栈的基本运算:
初始化voidInitStack(SqStack,入栈intPush(SqStack,取栈顶元素intGetTop(SqStackS,ElemType,出栈intPop(SqStack,
(2)栈的链式表示,由于栈的操作是线性表操作的特例,则链栈的操作易于实现,它是运算受限的单链表。
LinkStackS;
S为栈顶指针,它唯一地确定一个栈空栈时S=NULL。
由于链栈是动态分配结点的空间,所以操作时无需考虑上溢出问题。
链栈的插入、删除等运算的操作方法与单链表操作相似,也是通过修改指针进行的,只是链栈是限定在栈顶操作S而已。
typedefstructLNodeElemTypedata;
/结点数据域structLNode*next;
/结点链域*LinkStack;
操作:
建立空栈LinkStackInitStack(LinkStackS)S=NULL;
returnS;
入栈Push(LinkStack,取栈顶intGetTop(LinkStackS,ElemType,出栈PoP(LinkStack,数制转换十进制数转换为八进制数。
采用对十进制数除8取余的方法,可得到八进制数的倒序。
例如:
(1348)10=(2504)8,其运算过程如下:
NN8Nmod8134816841682102125202,4.2栈的应用举例,因此,若将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数。
voidconversion()InitStack(S);
/构造空栈scanf(”d”,&
N);
while(N)Push(S,N8);
N=N8;
while(!
StackEmpty(s)Pop(S,e);
printf(“%d”,e);
一个栈的入栈序列是a,b,c,d,e;
则栈的不可能的输出序列是()A)edcbaB)decbaC)dceabD)abcde,铁路进行列车调度时,常把站台设计成栈式结构
(1)设有编号为1,2,3,4,5,6的六辆列车,顺序开入栈式结构的站台,可能的出栈序列有多少种?
(2)能否得到435612,325641,154623,135426的出站序列。
4.将带头结点的单链表逆置,单链表的反转,head,an-1,a1,a2,an,head,an-1,a1,a2,an,反转前:
反转后:
5.表达式括号匹配判断,例如:
输入表达式括号:
()经过验证是匹配正确的表达式括号.或输入:
(则经过验证,是不匹配的表达式括号.输入:
()验证也是不匹配的括号.,3.3队列,1.队列将数据的输出限定在头端,输入限定在尾端进行的表,队列(Queue)是一种先进先出(FirstinFirstOut,缩写为FIFO)的线性表。
它只允许在表的一端进行插入,而在另一端删除元素。
最早进入队列的元素最早离开。
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。
假设队列为q=(a1,a2,an),那么,a1就是队头元素,an则是队尾元素。
队列中的元素是按照a1,a2,an的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在a1,a2,an-1都离开队列之后an才能退出队列。
队队尾头,入队列ana3a2a1出队列,队列的见教材P59下面给出队列的抽象数据类型定义:
ADTQueue基本操作:
InitQueue(&
Q)操作结果:
构造一个空队列Q。
DestroyQueue(&
队列Q被销毁,不再存在QueueEmpty(Q)操作结果:
若Q为空队列,则返回TRUE,否则FALSE。
QueueLength(Q)操作结果:
返回Q的元素个数,即队列的长度。
EnQueue(&
Q,e)操作结果:
插入元素e为Q的新的队尾元素。
DeQueue(&
Q,&
e)操作结果:
删除Q的队头元素,并用e返回其值。
3.队列的表达,顺序表达顺序队,#defineMaxsize100typedefstructElemTypedataMaxsize;
intfront;
intrear;
Squeue;
队列的进队和出队状态图:
front,rear,空队列,rear,A,B,C,D进队,rear,(a)空队列;
(b)J1、J2和J3,相继入队列;
(b)J1和J2相继被删除;
(d)J4、J5和J6相继插入队列之后J3、J4被删除。
(a)(b)(c)(d)头、尾指针和队列中元素之间的关系,Q.front,Q.rear,Q.front,Q.rear,“假”溢出的解决:
每当有元素从队头出去时,将剩下的元素依次前移,将队列人为的臆造成环状,形成循环队列,循环队列(CircularQueue),可用取模(余数)运算实现。
队头指针进1:
front=(front+1)%maxsize;
队尾指针进1:
rear=(rear+1)%maxsize;
队列初始化:
front=rear=0;
队空条件:
front=rear;
队满条件:
(rear+1)%maxsize=front;
0,1,2,3,4,5,6,7,循环队列,front,rear,Maxsize-1,软工0901讲到了此处,rear,一般情况,队满,front,队满(正确),rear,构造空队列StatusInitQueue(SqQueue,
(2)循环队列操作的实现,求队列长度,intQueueLength(SqQueueQ)return(Q.rearQ.front+MAXSIZE)%MAXSIZE;
入队,StatusEnQueue(SqQueue,出队,StatusDeQueue(SqQueue,循环队列的动态存储表示:
#defineMAXQSIZE100/最大队列长度typedefstructElemType*base;
/初始化的动态分配存储空间intfront;
/头指针,若队列不空,指向队列头元素intrear;
/尾指针,若队列不空,指向队列尾元素的下一个位置SqQueue;
StatusInitQueue(SqQueue&
Q)Q.base=(ElemType)malloc(MAXQSIZE*sizeof(ElemType);
if(!
Q.base)exit(OVERFLOW);
/存储分配失败Q.front=Q.rear=0;
构造空队列,2.链队列:
队列的链式表示,链队列中,有两个分别指示队头和队尾的指针。
链式队列在进队时无队满问题,但有队空现象。
typedefstructNodeElemTypedata;
/队列结点数据structNode*next;
/结点链指针QueueNode;
typedefstructQueueNode*front;
QueueNode*rear;
LinkQueue;
(1)链式队列的定义,
(2)链队列的主要操作,构造一个空队列StatusInitQueue(LinkQueue&
Q)Q.front=Q.rear=(QueueNode*)malloc(sizeof(Node);
Q.front)exit(0);
Q.frontnext=NULL;
入队:
StatusEnQueue(LinkQueue&
Q,ElemTypee)/插入元素e为Q的新的队尾元素p=(QueueNode*)malloc(sizeof(QNode);
pdata=e;
pnext=NULL;
Q.rearnext=p;
Q.rear=p;
intDeQueue(LinkQueue,出队:
StatusDestroyQueue(LinkQueuewhile(Q.front)p=Q.frontnext;
free(Q.front);
Q.front=p;
销毁整个队列:
3.5队列的应用,队列结构能用来干什么?
离散事件模拟,日常生活中排队活动的模拟程序需要用到队列和线性表的数据结构,是队列的典型应用。
设银行有四个窗口,从开门起每个窗口一个时刻只能接待一个客户,人多时客户需排队。
当客户进入银行时,如有窗口空闲则直接办理业务,否则会排在人数最少的队伍后面。
编程序模拟银行的业务活动并计算一天中客户在银行的平均逗留时间。
思路:
1.为求平均时间要知道每个客户到达和离开银行的两个时刻,所有客户逗留时间总和除以客户数便是平均时间。
2.客户到达和离开银行两个时刻发生的事情成为“事件”,整个程序按事件发生的先后顺序进行处理,即事件驱动模拟。
例:
用程序实现一个简单的排队过程的模拟。
银行客户的离散事件驱动模拟程序:
voidBank_Simulation(intCloseTime)/银行业务模拟,统计一天内客户在银行逗留的平均时间。
OpenF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章栈 队列