c语言:循环队列

1.在循环队列中需要设置队头,队尾两个指针,并且约定;队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素。队列的这种头尾相接的顺序存储结构称为循环队列。

2.在循环队列中有个很重要的问题就是:队空和队满的判定问题。在循环队列中队空和队满的判定条件都可以是front=rear。因此,我们需要浪费一个数组元素空间,让队满的条件变为:(rear+1)%QueueSize=front

#include<stdio.h>
#include<stdlib.h>
#define N 100

typedef struct queue
{
    int data[N];
    int front,rear;
} Queue;

/*
函数功能:队列初始化
函数接口:
*/
void init_queue(Queue *q)
{
    q->front=q->rear=0;
}

/*
函数功能:入队
*/
void push_queue(Queue *q,int data)
{
    //判断队列是否溢出
    if((q->rear+1)%N==q->front)    //队满的条件
    {
        printf("上溢\n");
        exit(-1);
    }
    q->data[q->rear]=data;
    q->rear=(q->rear+1)%N;   //循环意义下的加1
}

/*
函数功能:出队
*/
int get_queue(Queue *q)
{
    //队列判空操作
    if(q->front==q->rear)
    {
        printf("下溢\n");
        exit(-1);
    }
    int data;
    data=q->data[q->front];
    q->front=(q->front+1)%N;
    return data;
}

/*
函数功能:读取队头原数
*/
int get_front(Queue *q)
{
    //队列判空操作
    if(q->rear==q->front)
    {
        printf("下溢\n");
        exit(-1);
    }

    int data;
    data=q->data[q->front];
    return data;
}

int main(void)
{
    Queue *q=NULL;
    int push_data,get_data;
    char ch;
    int ret1,ret2;

    q=(Queue*)malloc(sizeof(Queue));
    if(q==NULL)
    {
        printf("内存申请失败\n");
        exit(-1);
    }
    //初始化
    init_queue(q);

    //入队
    while(1)
    {
        printf("请输入一个数值:");
        ret1=scanf("%d",&push_data);
        if(ret1!=1)
        {
            fflush(stdin);
            continue;
        }
        push_queue(q,push_data);
        printf("是否执行入队操作:");
        ret2=scanf(" %c",&ch);
        if(ch=='n'||ch=='N'&&ret2!=1)
        {
            break;
        }
    }
    //printf("%d--->%d",q->front,q->rear);
    //出队
    while(1)
    {
        printf("是否执行出队操作:");
        ret1=scanf(" %c",&ch);
        if(ret1!=1)
        {
            fflush(stdin);
            continue;
        }
        if(ch=='n'||ch=='N'){
            break;
        }
        printf("出队操作%d\n",get_queue(q));
    }

    //获取对头原数
    printf("队头元素为:%d",get_front(q));

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章