您的位置:首页 > 编程语言 > C语言/C++

C语言之循环队列判断满与空

2017-03-23 08:23 323 查看
何时队列为空?何时为满?
由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”。
注:先进入的为‘头’,后进入的为‘尾’。
解决此问题的方法至少有三种:
其一是另设一个布尔变量以匹别队列的空和满;
其二是少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);
其三是使用一个计数器记录队列中元素的总数(实际上是队列长度)【最简单方便的方法】
方法一实现:
预设一个标志,tag,初值=0,每当入队成功,tag=1;每当出队成功,tag=0;那么,当front==rear &&  tag 则表示“在入队操作之后front=rear”,显然入队造成的f=r的原因就是满了,故 front==rear &&  tag 表示队列满;同理,front==rear
&& !tag 表示队列空。 

方法二实现:
   

少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:

  队空时: front=rear

  队满时: (rear+1)%maxsize=front

  front指向队首元素,rear指向队尾元素的下一个元素。

[cpp] view
plaincopyprint?

/////////////////////////////////////////  

//   

// author: kangquan2008@csdn  

//  

/////////////////////////////////////////  

#include <stdio.h>  

#include <stdlib.h>  

#include <stdbool.h>  

  

#define QUEUE_SIZE 10  

#define EN_QUEUE 1  

#define DE_QUEUE 2  

#define EXIT     3  

  

typedef int    Item;  

typedef struct QUEUE{  

  

    Item * item;  

    int front;  

    int tear;  

  

}Queue;  

  

int init_queue(Queue * queue)  

{  

    queue->item = malloc(QUEUE_SIZE * sizeof(Item));  

    if(!queue->item)  

    {  

        printf("%s\n","Alloc failed,not memory enough");  

        exit(EXIT_FAILURE);  

    }  

  

    queue->front = queue->tear = 0;  

  

    return 1;  

}  

  

int en_queue(Queue * queue, Item item)  

{  

    if((queue->tear+1) % QUEUE_SIZE == queue->front)  

    {  

        printf("%s\n","The queue is full");  

        return -1;  

    }  

  

    queue->item[queue->tear] = item;  

    queue->tear = (queue->tear + 1) % QUEUE_SIZE;  

  

    return 1;  

}  

  

int de_queue(Queue * queue, Item * item)  

{  

    if(queue->front == queue->tear)  

    {  

        printf("%s\n","The queue is empty");  

        return -1;  

    }  

  

    (*item) = queue->item[queue->front];  

    queue->front = (queue->front + 1) % QUEUE_SIZE;  

  

    return 1;  

}  

  

int destroy_queue(Queue * queue)
 

{  free(queue->item);  

}  

  

int main()  

{  

    Queue que;  

    init_queue(&que);  

    int elem;  

    bool flag = true;  

    while(flag)  

    {  

        int choice;  

        printf("1 for en_queue,2 for de_queue,3 for exit\r\nplease input:");  

        scanf("%d",&choice);  

  

        switch((choice))  

        {  

            case EN_QUEUE:  

                printf("input a num:");  

                scanf("%d",&elem);  

                en_queue(&que,elem);  

                break;  

            case DE_QUEUE:  

                if(de_queue(&que,&elem) == 1)  

                    printf("front item is:%d\n",elem);  

                break;  

            case EXIT:  

                flag = false;  

                break;  

            default:  

                printf("error input\n");  

                break;  

        }  

    }  

  

    destroy_queue(&que);  

    return 0;  

}  

方法三实现、

    

#include <stdio.h>  

#include <assert.h>  

#define QueueSize 100  

typedef char datatype;  

//队列的数据元素  

typedef struct  

{  

     int front;  

     int rear;  

     int count;  //计数器,用来记录元素个数  

     datatype data[QueueSize]; //数据内容  

}cirqueue;  

//置空队  

void InitQueue(cirqueue *q)  

{  

     q->front = q->rear = 0;  

     q->count = 0;  

}  

//判断队满  

int QueueFull(cirqueue *q)  

{  

     return (q->count == QueueSize);  

}  

//判断队空  

int QueueEmpty(cirqueue *q)  

{  

     return (q->count == 0);  

}  

//入队  

void EnQueue(cirqueue *q, datatype x)  

{  

     assert(QueueFull(q) == 0); //q满,终止程序  

  

     q->count++;  

     q->data[q->rear] = x;  

     q->rear = (q->rear + 1)%QueueSize; //循环队列设计,防止内存浪费  



//出队  

datatype DeQueue(cirqueue *q)  

{  

     datatype temp;  

  

     assert(QueueEmpty(q) == 0);//q空,则终止程序,打印错误信息  

  

     temp = q->data[q->front];  

     q->count--;  

     q->front = (q->front + 1)%QueueSize;  

     return temp;  



转载出处:http://blog.csdn.net/lin111000713/article/details/40947267
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息