[数据结构]循环队列中判断队满与队空

标签: 循环队列
184人阅读 评论(0) 收藏 举报
分类:

在引用循环队列前,我们需要了解队列是如何线性实现的。
这里写图片描述
简单地讲,便是当队列为空时,front = rear = 0,每当插入元素尾指针+1,删除元素是头指针-1。但是,我们会发现一个问题,如上面的第四个图,0,1,2三个空间并没有使用。因此,为了占用该空间,我们使用了循环队列来实现。
循环队列原理图:
这里写图片描述
我们可以发现,当循环队列属于上图的d1情况时,是无法判断当前状态是队空还是队满。为了达到判断队列状态的目的,可以通过牺牲一个存储空间来实现。
如上图d2所示,
队头指针在队尾指针的下一位置时,队满。 Q.front == (Q.rear + 1) % MAXSIZE 因为队头指针可能又重新从0位置开始,而此时队尾指针是MAXSIZE - 1,所以需要求余。
当队头和队尾指针在同一位置时,队空。 Q.front == Q.rear;

以下是实现的代码:

#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100  //最大队列长度
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

typedef struct {
    ElemType *base;  //队列空间
    int front;   //队头指针
    int rear;       //队尾指针,若队尾不为空,则指向队尾元素的下一个位置
}SqQueue;

//初始化循环队列
Status initQueue(SqQueue &Q) {
    Q.base = (ElemType *) malloc(MAXSIZE * sizeof(ElemType));  //申请空间
    Q.front = Q.rear = 0;       //队空
    return OK;
}

//入队
Status enQueue(SqQueue &Q, ElemType e) {
    if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR; //队满,无法添加
    Q.base[Q.rear] = e;  //插入元素
    Q.rear =  (Q.rear + 1) % MAXSIZE; //队尾指针+1
    return OK;
}

//出队
Status deQueue(SqQueue &Q, ElemType &e) {
    if (Q.front == Q.rear) return ERROR; //队空,无法删除
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXSIZE;  //队头指针+1
    return OK;
}

//返回队列长度
Status length(SqQueue &Q) {
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; 
}
查看评论

循环队列队空与队满两个状态的判断算法分析

线性表是数据结构中比较重要的一种逻辑结构,插入删除操作是线性表的基本操作,当进行这些操作时,不仅需要考虑插入、删除的位置是否合法性,仍然需要考虑‘满’与‘空’这两种状态,但是,由于栈和队列都是受限制的...
  • zhupengqq
  • zhupengqq
  • 2016-04-12 15:30:26
  • 3685

循环队列的队空与队满的条件

为了方便起见,约定:初始化建空队时,令       front=rear=0,   当队空时:front=rear   当队满时:front=rear 亦成立   因此只凭等式front=re...
  • woxiaozhi
  • woxiaozhi
  • 2013-05-23 21:58:07
  • 876

循环队列队满和队空的判定

循环队列的队空与队满的条件 分类: 数据结构与算法2010-07-07 21:31 8976人阅读 评论(3) 收藏 举报 inputstruct 为了方便起见,约定:初...
  • u010102951
  • u010102951
  • 2014-09-21 10:18:13
  • 640

循环队列中判断队满与队空

在引用循环队列前,我们需要了解队列是如何线性实现的。 简单地讲,便是当队列为空时,front = rear = 0,每当插入元素尾指针+1,删除元素是头指针-1。但是,我们会发现一个问题,如上面...
  • u010429311
  • u010429311
  • 2016-04-02 11:16:38
  • 8818

数据结构与算法之—循环队列

队列是软件开发中最常见的一种数据结构,先来先服务,以及任务调度的一种最基本的方式。 下面是一个循环队列模板类...
  • coder_yi_liu
  • coder_yi_liu
  • 2012-10-21 12:33:02
  • 417

数据结构-队列(queue)

队列(queue)是一种采用先进先出(FIFO)策略的抽象数据结构,它的想法来自于生活中排队的策略。顾客在付款结账的时候,按照到来的先后顺序排队结账,先来的顾客先结账,后来的顾客后结账。队列实现同栈的...
  • juanqinyang
  • juanqinyang
  • 2016-05-09 16:51:40
  • 8759

数据结构实践——队列数组

本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目。【项目 - 队列数组】   创建10个队列,分别编号为0-9(处理为队列数组,编号即下标)。输入若干个正整数,以数字0作为结束。设输入的...
  • sxhelijian
  • sxhelijian
  • 2015-10-06 07:13:36
  • 2351

循环队列中判断队满队空(数组实现的循环队列)

在引用循环队列前,我们需要了解队列是如何线性实现的。    (纠错:上图中出队列应该是:x=sq[front++])简单地讲,便是当队列为空时,front = rear = 0,每当插入元素尾指针+1...
  • cnd2449294059
  • cnd2449294059
  • 2017-08-14 11:15:55
  • 245

怎么判断循环队列是否为空?或者已经满了?

现有一个循环队列,其队头指针为 front,队尾指针为 rear,循环队列的总长度为 N,问怎么判断循环队列满了? 正确答案: D    front==rear front==rear...
  • You_are_my_dream
  • You_are_my_dream
  • 2017-03-29 18:39:28
  • 7382

算法设计-利用标记tag判别队列是否为空或满

假设一个数组squ[m]存放循环队列的元素,要使这个m个分量都得到利用,以设立标记tag为0或者1来区分尾指针和头指针值相同时队列的状态是空还是满。思路:(rear+1)%m==front 则队列满,...
  • darkxiaoming
  • darkxiaoming
  • 2018-04-16 08:53:09
  • 21
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 257万+
    积分: 3万+
    排名: 133
    博客专栏
    最新评论
    文章存档