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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章