靜態數組實現循環隊列 c語言
#include
#include
#define Data_Type int
#define Queue_Len 5
//判斷隊滿有兩種方式,一種是加以個標記,比如說size。
//另一種是浪費一塊空間,當占到N-1時,就算滿。
typedef struct Queue{
Data_Type data[Queue_Len];
int front;//隊頭元素的前一個元素
int rear;// 隊尾元素
//int size; 記錄隊列的大小
}QUEUE,* QQUEUE;
void create(QQUEUE);
bool isFull(QQUEUE);
bool isEmpty(QQUEUE);
bool add(QQUEUE,Data_Type);
Data_Type out(QQUEUE);
void traverse(QQUEUE);
int main(void){
QUEUE queue ;
create(&queue);
add(&queue,1);
add(&queue,2);
add(&queue,3);
add(&queue,4);
out(&queue);
add(&queue,5);
out(&queue);
add(&queue,6);
out(&queue);
add(&queue,7);
traverse(&queue);
}
bool isFull(QQUEUE qQuere){
if((qQuere->rear+1)%Queue_Len==qQuere->front){
return true;
} else{
return false;
}
}
bool isEmpty(QQUEUE qQueue){
if(qQueue->front==qQueue->rear){
return true;
}else{
return false;
}
}
void create(QQUEUE qQueue){
qQueue->front=qQueue->rear=0;
return;
}
void traverse(QQUEUE qQueue){
int i=qQueue->front;
while(i!=qQueue->rear){
//這裡比較繞,為什麼輸出時要取余?
//首先front表示的是隊首元素的前一個元素,肯定是不能輸出的。
// 如果給他+1,則可以正常輸出隊首。
//但隊尾會出問題,如果下標是隊尾下標,+1則會超出數組長度
//所以再取余, 則輸出正常
printf(%d
,qQueue->data[(i+1)%Queue_Len]);
i++;
i=i%Queue_Len;
//換一種好理解的
//先找到下一個合法元素,找到再輸出
//所以直接輸出i 就可以了,因為i已經是要找的下一個元素。
//i++;
//i=i%Queue_Len;
//printf(%d
,qQueue->data[i]);
}
}
bool add(QQUEUE qQueue,Data_Type val){
if(isFull(qQueue)){
return false;
}else{
qQueue->rear = (qQueue->rear+1)%Queue_Len;
qQueue->data[qQueue->rear]=val;
return true;
}
}
Data_Type out(QQUEUE qQueue){
if(isEmpty(qQueue)){
exit(-1);
}else{
Data_Type val = qQueue->data[qQueue->front+1];
qQueue->front = (qQueue->front+1)%Queue_Len;
return val;
}
}