#include<stdio.h>
#include<malloc.h>
#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\n",qQueue->data[(i+1)%Queue_Len]);
i++;
i=i%Queue_Len;
//换一种好理解的
//先找到下一个合法元素,找到再输出
//所以直接输出i 就可以了,因为i已经是要找的下一个元素。
//i++;
//i=i%Queue_Len;
//printf("%d\n",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;
}
}
静态数组实现循环队列 c语言
最新推荐文章于 2024-06-19 08:00:00 发布