【数据结构】头歌实践教学·循环队列

一、学习总结

循环队列

初始时:Q.front = Q.rear = 0
队首指针+1:Q.front = (Q.front + 1) % MAX_QSIZE;
队尾指针+1:Q.rear = (Q.rear + 1) % MAX_QSIZE;
队列长度:(Q.rear - Q.front + MAX_QSIZE)% MAX_QSIZE;
队满条件:(Q.rear + 1) % MAX_QSIZE == Q.front;  **队头指针在队尾指针的下一位置作为队满的标志**
队空条件仍为:Q.front == Q.rear;
队中元素个数:(Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;

二、基本操作

1.构造一个空队列Q

知识点

  • 队列中的数据元素:①base ②front ③rear
  • 为队列分配空间 (和销毁的区别)
  • 为空时Q.rear = Q.front = 0;

代码

Status InitQueue(SqQueue &Q)
{ // 构造一个空队列Q
   /********** Begin **********/ 
   Q.base = new QElemType[MAX_QSIZE];
   if (!Q.base) exit(OVERFLOW);
   Q.front = Q.rear = 0;
   return OK;
	/********** End **********/  
}

2.销毁队列Q,Q不再存在

知识点

  • 注意与构造的区别

代码

Status DestroyQueue(SqQueue &Q)
{ // 销毁队列Q,Q不再存在
   /********** Begin **********/ 
   Q.front = Q.rear = 0;
   return OK;
	/********** End **********/  
}

3.将Q清为空队列

知识点

  • 与销毁操作相同

代码

Status ClearQueue(SqQueue &Q)
{ // 将Q清为空队列
    /********** Begin **********/ 
    Q.front = Q.rear = 0;
    return OK;
	/********** End **********/  
}

4.若队列Q为空队列,则返回TRUE;否则返回FALSE

知识点

  • 两个判别条件

代码

Status QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE;否则返回FALSE
   /********** Begin **********/ 
   if (Q.front == Q.rear || Q.rear + 1 == Q.front) return TRUE;
   else return FALSE;
	/********** End **********/  
 }

5.返回Q的元素个数,即队列的长度

知识点

  • 注意要加上队列长度后再模队列

代码

int QueueLength(SqQueue Q)
{ // 返回Q的元素个数,即队列的长度
   /********** Begin **********/ 
   return (Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
	/********** End **********/  
 }

6.若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR

知识点

  • 注意表示方法:Q.base[Q.front];

代码

Status GetHead(SqQueue Q,QElemType &e)
 { // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
   /********** Begin **********/ 
   if (Q.rear == Q.front || Q.rear + 1 == Q.front) return ERROR;
   e = Q.base[Q.front];
   return OK;
 /********** End **********/  
}

7.插入元素e为Q的新的队尾元素

知识点

  • 队头指针在队尾指针的下一位置作为队满的标志

代码

Status EnQueue(SqQueue &Q,QElemType e)
{ // 插入元素e为Q的新的队尾元素
   /********** Begin **********/ 
   if ((Q.rear + 1) % MAX_QSIZE == Q.front) return ERROR;
   Q.base[Q.rear] = e;
   Q.rear = (Q.rear + 1) % MAX_QSIZE;
	/********** End **********/  
 }

8.若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR

知识点

  • 由于是循环队列,因此删除队头元素后Q.rear需前进1

代码

Status DeQueue(SqQueue &Q,QElemType &e)
{ // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
   /********** Begin **********/ 
   if (Q.front == Q.rear) return OK;
   e = Q.base[Q.front];
   Q.front = (Q.front + 1) % MAX_QSIZE;
   return OK;
	/********** End **********/  
}

9.从队头到队尾依次对队列Q中每个元素调用函数vi()

知识点

我真的不明白这个

代码

Status QueueTraverse(SqQueue Q)
{ // 从队头到队尾依次对队列Q中每个元素调用函数vi()
   /********** Begin **********/ 
 	int i = Q.front % MAX_QSIZE;
    while (i != Q.rear % MAX_QSIZE) {
      cout<<" "<<Q.base[i % MAX_QSIZE];
      i = (i + 1) % MAX_QSIZE;
   }
   cout<<endl;
   return OK;
	/********** End **********/  
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值