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

转载 2017年11月14日 08:41:03

在引用循环队列前,我们需要了解队列是如何线性实现的。
这里写图片描述
简单地讲,便是当队列为空时,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; 
}

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

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

栈与队列--判断栈/队列为空/满

数组栈 完成int IsEmpty(Stack S)函数,该函数判断栈是否已空,如果空返回1,否则返回0。 完成int IsFull(Stack S)函数,该函数判断栈是否已满,如果满返回1,否则...
  • z861269429
  • z861269429
  • 2016年06月28日 10:24
  • 887

数据结构-循环顺序队(C语言)

循环队列中,空队、满队判决条件(head==tail)出现二义性。 以下代码采用人为浪费一个单元方式解决二义性问题。 空队特征:head=tail 满队特征:head=(tail+1)%QueueMa...
  • Yeziquanquan
  • Yeziquanquan
  • 2016年09月11日 01:17
  • 707

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

循环队列的一些基本操作 void InitQueue(SqQueue &Q) { // 构造一个空队列Q Q.base = (QElemType *)malloc(MAX_QSIZE...
  • qq_31214097
  • qq_31214097
  • 2015年10月25日 22:18
  • 3814

链队列、循环队列的实现(初始化、出队、入队、取队头元素、判空)

链队列 #include #include //结点的结构体定义 typedef int DataType; typedef struct qnode { DataType data; stru...
  • qq_38004995
  • qq_38004995
  • 2017年04月09日 15:27
  • 2111

循环顺序队列(初始化、入队、出队、判空)

采用循环顺序方式存储队列,测试用例为:将0~9入队,然后打印输出,代码如下: #define MAXQSIZE 100 typedef struct { QElemType data[MAXQS...
  • tkp2014
  • tkp2014
  • 2015年07月05日 10:03
  • 712

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

为了方便起见,约定:初始化建空队时,令       front=rear=0,   当队空时:front=rear   当队满时:front=rear 亦成立   因此只凭等式front=re...
  • abcd1f2
  • abcd1f2
  • 2014年07月19日 00:29
  • 470

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

为了方便起见,约定:初始化建空队时,令    front=rear=0,   当队空时:front=rear   当队满时:front=rear 亦成立   因此只凭等式front=rear无...
  • stawn
  • stawn
  • 2013年09月23日 10:29
  • 710

循环队列判断满与空

何时队列为空?何时为满? 由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”。 注:先进...
  • lin111000713
  • lin111000713
  • 2014年11月09日 08:54
  • 3053

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

原帖地址 :http://blog.csdn.net/kangquan2008/article/details/5719529 为了方便起见,约定:初始化建空队时,令     ...
  • nomefat
  • nomefat
  • 2013年05月29日 11:26
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构]循环队列中判断队满与队空
举报原因:
原因补充:

(最多只允许输入30个字)