循环队列(不扩容)
#include<bits/stdc++.h>
#define MAXSIZE 5
typedef int elemtype;
typedef struct{int maxsize,front,rear;//实际最大容量只有maxsize-1,留一个不用 elemtype *base;
}SqQueue;
bool InitQueue(SqQueue &Q,int size=MAXSIZE);
int QueueLength(SqQueue Q);
bool DestroyQueue(SqQueue &Q);
bool QueueEmpty( SqQueue Q );
bool QueueFull( SqQueue Q );
bool EnQueue(SqQueue &Q,elemtype e);
bool DeQueue ( SqQueue &Q , elemtype &e );int main(){SqQueue Q;// 测试初始化printf("=== 初始化队列(容量%d)===\n", MAXSIZE-1);InitQueue(Q, MAXSIZE);printf("初始化成功!队列空: %s\n", QueueEmpty(Q) ? "是" : "否");// 测试入队printf("\n=== 测试入队操作 ===\n");for(int i = 1; i <= MAXSIZE; i++) {if(EnQueue(Q, i * 10)) {printf("入队成功: %d, 队列长度: %d\n", i * 10, QueueLength(Q));} else {printf("入队失败: %d (队列已满)\n", i * 10);}}// 测试队列满printf("\n队列满: %s\n", QueueFull(Q) ? "是" : "否");// 测试出队printf("\n=== 测试出队操作 ===\n");elemtype value;for(int i = 0; i < 2; i++) {if(DeQueue(Q, value)) {printf("出队成功: %d, 队列长度: %d\n", value, QueueLength(Q));} else {printf("出队失败 (队列已空)\n");}}// 再次入队测试循环特性printf("\n=== 再次入队测试循环特性 ===\n");for(int i = 1; i <= 3; i++) {if(EnQueue(Q, i * 100)) {printf("入队成功: %d, 队列长度: %d\n", i * 100, QueueLength(Q));} else {printf("入队失败: %d (队列已满)\n", i * 100);}}// 全部出队printf("\n=== 全部出队 ===\n");while(!QueueEmpty(Q)) {if(DeQueue(Q, value)) {printf("出队: %d, 剩余长度: %d\n", value, QueueLength(Q));}}printf("最终队列空: %s\n", QueueEmpty(Q) ? "是" : "否");// 销毁队列DestroyQueue(Q);printf("\n队列已销毁\n");return 0;
}
bool DeQueue ( SqQueue &Q , elemtype &e ){if(QueueEmpty(Q))return 0;e=Q.base[Q.front];Q.front=(Q.front+1)%Q.maxsize;return 1;
}
bool EnQueue(SqQueue &Q,elemtype e){if(QueueFull(Q))return 0;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%Q.maxsize;return 1;
}
bool QueueFull( SqQueue Q ){if((Q.rear+1)%Q.maxsize==Q.front)return 1;else return 0;
}
bool QueueEmpty( SqQueue Q ){if(Q.front==Q.rear)return 1;else return 0;
}
bool DestroyQueue(SqQueue &Q){free(Q.base);Q.base=NULL;return 1;
}
bool InitQueue(SqQueue &Q,int maxsize){Q.base=(elemtype*)malloc(sizeof(elemtype)*maxsize);if(!Q.base)exit(1);Q.maxsize=maxsize;Q.front=Q.rear=0;return 1;
}
int QueueLength(SqQueue Q){return (Q.rear-Q.front+Q.maxsize)%Q.maxsize;//r points to the next avaiable position!!
}
扩容比较麻烦,这里不实现,同时实际最大大小只有maxsize-1,用于区分和栈为空的情况
