3.1 栈3.2 栈的应用举例3.3 队列3.4 队列应用举例.ppt

3.1 栈3.2 栈的应用举例3.3 队列3.4 队列应用举例.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.1 栈3.2 栈的应用举例3.3 队列3.4 队列应用举例.ppt

第3章 栈和队列 datatype top(int i) { datatype x; if (i==0) if(ta0) { x=v[ta-1]; return x; } else return NULL; if(i==1) if (tbm-1) { x=v[tb+1]; return x; } else return NULL; return NULL; } 3.4* 队列的应用举例 3.3.2 顺序队列 队列的顺序存储结构称为顺序队列。顺序队列用一个向量空间来存放当前队列中的元素。 由于队列的队头和队尾的位置均是变化的,因而要设置两个指针,分别指示当前队头元素和队尾元素在向量空间中的位置。 typedef char datatype; #define maxsize 4 typedef struct {datatype data[maxize]; int front,rear; }sequeue; sequeue *sq; 空队列时,队列的头、尾指针都指向向量空间的前一位置,在此可设为-1。 sq-front=-1; sq-rear=-1; A 0 B 1 C 2 3 sq→front -1 sq→rear 规定:队头指针front总是指向当前队头元素的前一位置;尾指针rear总是指向当前队尾元素的位置。 0 1 2 3 sq→front sq→rear -1 队尾 sq→rear -1 0 1 2 3 A B 队头 sq→front C D 顺序队列满判断条件: sq→rear=M-1 顺序队列从队尾入队,为 : sq→rear++; sq→data[sq→rear]=x; 队列满,不能再入队了,再入队就出现“上溢”现象!!! 队尾 sq→rear 队尾 sq→rear M=4 顺序队列 顺序队列入队操作 队尾 sq→rear -1 0 1 2 3 A B 队头 sq→front 因为 sq→rear = M-1 故不能再做入队操作。但当前队列并不满,我们把这种现象称为“假上溢”现象。 顺序队列从队头出队,为: sq→front++; return(sq→data[sq→font]); 队头 sq→front 队头 sq→front 顺序队列空判断条件: sq→rear==sq→front 队列满,不能再入队了! 队列空,不能再出队了,再出队就出现“下溢”现象了! M=4 顺序队列 顺序队列出队操作   克服“假上溢”现象,通常采用的方法是:设想向量是一个首尾相接的圆环,即下标为0的向量接在下标为maxsize-1的向量之后,我们将这种意义下的向量称为循环向量,并将循环向量中的队列称为循环队列。 队头 sq→front 队尾 sq→rear 0 1 2 3 C D (顺序队列) front 0 1 2 3 rear C D (循环队列) 循环队列入队运算: if (sq→rear+1)=M) sq→rear=0; else sq→rear++; sq→data[sq→rear]=x; 上述运算可等价于: sq→rear=(sq→rear+1)%M; sq→data[sq→rear]=x; front 0 1 2 3 rear C D (循环队列) rear front 0 1 2 3 rear C (循环队列) A B 循环队列出队运算: sq→front=(sq→front+1)%M; return(sq→data[sq→front]); front front 0 1 2 3 rear A B front 0 1 2 3 rear A B rear C rear D (C、D入队) (某时刻队列状态) (C、D入队后队列满) front 0 1 2 3 rear A B (A、B出队) front front 问题: sq→rear= =sq→front无法区分队列是空还是满? (A、B出队后队列空) 解决办法之一: ①空队列时,令队列的头指针和尾指针都等于M-1,因此 sq→rear= =sq→front 为判断队列空的条件。 front 0 1 2 3 rear 队列空状态 front 0 1 2 3 rear 队列满状态 C B A ③浪费了一个向量空间用于区别队列的首尾。 ②入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为是队满,则判断队满条件是: (sq→rear+1)%M==sq→front front 0 1 2

文档评论(0)

gshshxx + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档