C++中级第3讲 队列.pptxVIP

  • 4
  • 0
  • 约 32页
  • 2024-05-30 发布于广西
  • 举报
C++中级第3讲队列.pptxC++中级第3讲队列.pptx

学科竞赛编程教研研究院C++NOIPNOIIOI

1PARTONE队列的基本概念队列的实现方式队列的基本操作队列的抽象数据类型队列的定义1234

1PARTONE先进先出(FirstInFirstOut)限制访问点的线性表按照到达的顺序来释放元素。所有的插入在表的一端进行,所有的删除都在表的另一端进行?主要元素队头(front)队尾(rear)队列的基本概念——队列的定义队列(Queue):具有一定操作约束的线性表插入和删除操作:只能在一端插入,而在另一端删除。

1PARTONE队列的基本概念——队列的基本操作出队操作判断队列是否为空入队操作创建队列计算队列的长度

1PARTONE队列的基本概念——队列的抽象数据类型templateclassTclassQueue{public:voidclear();boolenQueue(constTitem);booldeQueue(Titem);boolgetFront(Titem);boolisEmpty();boolisFull();};//队列的运算集//变为空队列//将item插入队尾,成功返回真,否则假//返回队头元素并将其从队列中删除,成功则返回真//返回回队头元素,但不删除,成功则返回真//若队列已空返回真//若队列已满返回真

1PARTONE队列的基本概念——队列的实现方式顺序队列队列的顺序存储实现。通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。关键是如何防止假溢出固定的存储空间链式队列队列的链式存储结构。可以用一个单链表实现。插入和删除操作分别在链表的两头进行,队列中每个元素对于链表中的一个结点可以满足大小无法估计的情况都不允许访问队列内部元素

1PARTONE空队列条件:front==rear设两个指针front,rear:rear指示队尾元素位置front指示对头元素位置初值front=rear=0入队列:q[rear++]=x;出队列:x=q[front++];用数组模拟普通队列

1PARTONE(1)创建数组,对数组进行入队及出队的操作voidPush(intvalue){if(rearMaxSize){q[rear++]=value;}}(2)入队操作,向队列中添加valueconstintMaxSize=100;intq[MaxSize];intfront=0;intrear=0;intpop(){if(front!=rear){returnq[front++];}}(3)出队操作,返回出队元素的值用数组模拟普通队列思考:如何用数组模拟计算队列的长度和判断队列是否为空?

1PARTONE用数组模拟环形队列一般情况对满状态front==rear对空状态front==rear如何区分对满与对空呢?解决方案:1.另外设一个标志以区别对空、对满2.少用一个元素空间,约定对头指示的位置不存放元素对空:front==rear队满:(rear+1)%M==frontM为数组长度

1PARTONE用数组模拟队列判断是否溢出常规队列的几种溢出情况(1)设数组长度为M,则当front=0,rear=M时,再有元素入队发生溢出——真溢出当front≠0,rear=M时,再有元素入队发生溢出——假溢出(2)当rear指向数组的最后一个元素的时候,队列再也无法插入新元素,而这时常常还有大量的内存空间被闲置earfront7rearfront真溢出假溢出3

1PARTONE用数组模拟队列判断是否溢出为克服假溢出——环形队列被采用克服真溢出的解决方案:(1)队首固定,每次出队剩余元素向下移动——浪费时间(2)假设队列长为M,让q[0]接在q[M-1]之后,如果rear+1==M,则rear=0。实现:在rear!=front前提下(即队列不满),利用“模”入队:q[rear]=x;rear=(rear+1)%M;出队:x=q[front];front=(front+1)%M;

1PARTONE用数组模拟队列——练习常规队列纸牌问题【问题描述】桌面有一叠牌,从第一张(即位于顶面的牌)开始从上往下依次编号为1~n。当至少还剩两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张放到整贴牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌(3

文档评论(0)

1亿VIP精品文档

相关文档