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;
}