用c语言 顺序表 实现环形队列,开一个大小为10数组,入队的时候就一个一个往里面存放,存放到第10个的时候就从第一个开始存放。
基于Visual Studio 2019 测试20个数据入队(0-19),每次入队5个就出队一个,结果如下:
0 队头 = 0 队尾 = 1 大小 = 1
0 1 队头 = 0 队尾 = 2 大小 = 2
0 1 2 队头 = 0 队尾 = 3 大小 = 3
0 1 2 3 队头 = 0 队尾 = 4 大小 = 4
1 2 3 4 队头 = 1 队尾 = 5 大小 = 4
1 2 3 4 5 队头 = 1 队尾 = 6 大小 = 5
1 2 3 4 5 6 队头 = 1 队尾 = 7 大小 = 6
1 2 3 4 5 6 7 队头 = 1 队尾 = 8 大小 = 7
1 2 3 4 5 6 7 8 队头 = 1 队尾 = 9 大小 = 8
2 3 4 5 6 7 8 9 队头 = 2 队尾 = 0 大小 = 8
2 3 4 5 6 7 8 9 10 队头 = 2 队尾 = 1 大小 = 9
2 3 4 5 6 7 8 9 10 11 队头 = 2 队尾 = 2 大小 = 10
2 3 4 5 6 7 8 9 10 11 队头 = 2 队尾 = 2 大小 = 10
2 3 4 5 6 7 8 9 10 11 队头 = 2 队尾 = 2 大小 = 10
3 4 5 6 7 8 9 10 11 队头 = 3 队尾 = 2 大小 = 9
3 4 5 6 7 8 9 10 11 15 队头 = 3 队尾 = 3 大小 = 10
3 4 5 6 7 8 9 10 11 15 队头 = 3 队尾 = 3 大小 = 10
3 4 5 6 7 8 9 10 11 15 队头 = 3 队尾 = 3 大小 = 10
3 4 5 6 7 8 9 10 11 15 队头 = 3 队尾 = 3 大小 = 10
4 5 6 7 8 9 10 11 15 队头 = 4 队尾 = 3 大小 = 9
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
//注释:
//Ctrl + K → 选定需要注释的代码段 →Ctrl + C
//
//取消注释:
//Ctrl + K → 选定需要取消注释的代码段 →Ctrl + U
#include <stdio.h>
#include <stdbool.h>
#define MaxSize 10 //定义队列中元素的最大个数
typedef int ElemType;
typedef struct {
ElemType data[MaxSize]; //用静态数组存放队列元素
int front, rear; //队头针和队尾指针
int size; //队列长度
} SqQueue;
//初始化队列
void InitQueue(SqQueue *Q){
//初始时 队头、队尾、长度、指向0
Q->rear = Q->front = Q->size= 0;
}
//判断队列是否为空
bool QueueEmpty(const SqQueue* Q) {
//队空条件
if (Q->size) return false;
else return true;
}
//入队
bool EnQueue(SqQueue* Q, ElemType x) {
//队满则报错
/* 队头指针的下一个位置等于队尾指针,队列满了 */
if (Q->size == 10) return false;
//将x插入队尾
Q->data[Q->rear] = x;
//队尾指针后移
Q->rear = (Q->rear + 1) % MaxSize;
//队列长度加1
Q->size++;
return true;
}
//出队 (删除一个队头元素, 并用x返回)
bool DeQueue(SqQueue* Q, ElemType* x) {
//队空则报错
if (QueueEmpty(Q)) return false;
//取出队头
*x = Q->data[Q->front];
//队头指针后移
Q->front = (Q->front + 1) % MaxSize;
//队列长度减1
Q->size--;
}
//获得队头元素的值,并用x返回
bool GetHead(const SqQueue* Q, ElemType* x) {
//队空则报错
if (QueueEmpty(Q)) return false;
//取出队头
*x = Q->data[Q->front];
return true;
}
//队列打印
void printfQueue(const SqQueue* Q){
int count = Q->size;
int hand = Q->front;
while (count--){
printf("%d ", Q->data[hand]);
hand = (hand + 1) % MaxSize;
}
printf("\t\t队头 = % d\t", Q->front);
printf("队尾 = %d\t", Q->rear);
printf("大小 = %d\t\r\n", Q->size);
}
void testQueue(void)
{
SqQueue Q;
InitQueue(&Q);
for (int i = 0; i < 20; i++)
{
EnQueue(&Q, i);
/* 入队5个的时候删除一个 */
if ((i+1) % 5 == 0)
{
ElemType a[1];
DeQueue(&Q, a);
}
printfQueue(&Q);
}
}
int main()
{
testQueue();
return 0;
}