数据结构循环队列(c语言描述)

  循环队列也是队列的顺序存储结构,只是在原先的队列的基础上进行的优化,我在写的时候出现了一些问题,但是我搜索的博客中都没有提到这个问题,

  首先: front是指向队列的第一个元素,rear是指向队尾的下一个元素,MAXSIZE是队列的最大容量 (首先我卖个关子,这里MAXSIZE的描述是错的)

      队列满条件:(front+1)%MAXSIZE=rear; 

      队列为空条件: front=rear;

      队列的长度:(rear-front+MAXSIZE)%MAXSIZE;

  但是按照我们自己的逻辑的时,队列满的条件是 :front=rear; 和老师的上述不同,在这个地方困扰了我很久,后来才知道:MAXSIZE=队列的容量+1,队列会牺牲一个空间,当队列满了,队头指针在队尾指针的下一个位置。搞懂了这个下面就比较容易了。

所有的代码如下:

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 6  //队列的最大长度+1,数组的其中一个元素空着。 
typedef int ElemType;
typedef struct Queue{
    ElemType *data;  //数组
    ElemType front;  //指向头部 
    ElemType rear;  //指向尾部的下一个元素(有数据的尾部)
}Queue;

//初始化循环队列 
void initQueue(Queue *q)
{
    q->data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));  //为数组创建动态空间 
    q->front=q->rear=0; //队头和队尾都为0 
}

//入队列 
void push(Queue *q,ElemType e)
{
    if((q->rear+1)%MAXSIZE==q->front)  //队列空间满了 
    {
        printf("队列空间已满,无法入队
");
    }
    else
    {
        q->data[q->rear]=e;
        q->rear=(q->rear+1)%MAXSIZE;//获取队列的下一个坐标
    }
}

//出队列
ElemType pop(Queue *q,ElemType *e)
{
    if(q->front==q->rear)
    {
        printf("队列空间为空,无法出队
");
        return -1;
    }
    else
    {
        *e=q->data[q->front];
        q->front=(q->front+1)%MAXSIZE;
        return *e;
    }
}

//销毁队列
void destroyQueue(Queue *q)
{
    free(q->data);
    q->front=q->rear=0;
}

//打印队列
void printfQueue(Queue q)
{
    int length=(q.rear-q.front+MAXSIZE)%MAXSIZE;
    for(int i=0;i<length;i++)
    {
        printf("%d  ",q.data[q.front]);
        q.front=(q.front+1)%MAXSIZE; 
    }
    printf("
");
}

int main()
{
    Queue q;//声明结构体对象
    int number;//指令
    int e;     // 数据
    initQueue(&q);//初始化
    
    printf("结束操作----------0
");
    printf("入队列操作----------1
");
    printf("出队列操作----------2
");
    printf("销毁队列操作----------3
");
    printf("打印操作----------4
"); 
    printf("请输入你的指令:");
    scanf("%d",&number);
    
    while(number!=0)
    {
        switch(number)
        {
            case 1:
                printf("请输入要入队列的值:");
                scanf("%d",&e);
                push(&q,e);
                break;
                
            case 2:
                e=pop(&q,&e);
                printf("出队列的值为:%d
",e);
                break;
                
            case 3:
                destroyQueue(&q);
                printf("队列已销毁");
            
            case 4:
                printfQueue(q);
                break;
            
            default:
                printf("你输入的指令不正确
");
        }
        printf("你的指令为:");
        scanf("%d",&number);
    }
    return 0;
}

  今日就这样结束了,日记结束。如果大家有什么问题欢迎提出来

原文地址:https://www.cnblogs.com/qian-yi/p/12728223.html