设计采取少用一个存储单元的方法解决队列满和队列空判断。设队列的元素类型为DataType,实现顺序循环队列的各种基本操作:
① 初始化队列Q;
② 判断队列Q是否为空;
③ 入队操作;
④ 出队操作;
⑤ 输出队列元素个数;
⑥ 输出队列序列;
⑦ 编写一个测试主函数,要求将若干个元素(不少于6个)入队;输出队列序列;出队若干个元素(同时输出出队元素);通过函数调用实现以上各项操作。
测试数据:
字符型数据:假设队列的元素类型为char,建议用自己姓名的全拼。例如:依次输入:dongdongqiang 输出d o n g d o n g q i a n g
#include<stdio.h>
#define MaxQueueSize 20 //定义顺序循环队列的最大容量
typedef char DataType; //定义顺序循环队列的数据类型
typedef struct{ //顺序循环队列结构体
int rear; //尾指针
int front; //头指针
int count; //计数器
DataType queue[MaxQueueSize];
}SeqCQueue;
//初始化队列Q
void QueueInitiate(SeqCQueue *Q){
Q->rear = 0; //尾指针初始为0
Q->front = 0; //头指针初始为0
Q->count = 0; //计数器初始为0
}
//判断队列Q是否为空
int QueueNotEmpty(SeqCQueue Q){
//队列为空返回0 不空返回1
if(Q.count == 0) return 0;
else return 1;
}
//入队列操作
int QueueAppend(SeqCQueue *Q , DataType x){
//队尾插入数据x 插入成功返回1 失败返回0
if(Q->count > 0 && Q->rear == Q->front){
printf("队列已满无法插入 出错!\n");
return 0;
}
else{
Q->queue[Q->rear] = x;
Q->rear = (Q->rear + 1)%MaxQueueSize;
Q->count++;
return 1;
}
}
//出队列操作
int QueueDelete(SeqCQueue *Q , DataType *d){
//删除顺序循环队列队头元素并赋值给d 成功返回1 失败返回0
if(Q->count == 0){
printf("队列已空无法出队 出错!\n");
return 0;
}
else{
*d = Q->queue[Q->front]; //取出队头元素赋值给d
Q->front = (Q->front + 1)%MaxQueueSize; //更新队头指针 队头指针+1
Q->count--; //计数器-1
return 1;
}
}
//输出队列元素个数
void QueuePrintCount(SeqCQueue Q){
printf("Queue count: %d\n" , Q.count);
}
//输出队列序列
void QueuePrintAll(SeqCQueue Q){ //函数值传递形参与传入的实参不是同个地址
SeqCQueue *q = &Q; //定义指针指向队列
DataType x;
while(q->count != 0){ //如果队列不空
QueueDelete(q , &x); //出队头元素
printf("%c " , x); //打印元队头数据
}
}
//主函数
int main(){
SeqCQueue Q;
DataType d;
QueueInitiate(&Q); //队列初始化---初始化队列 函数的调用
d = '0'; //参数d初始化为'0'
printf("Input your name:");
//将自己的姓名全拼入队
while(d != '\n'){
//遇到回车符 跳出循环
scanf("%c" , &d);
QueueAppend(&Q , d); //入队列操作 函数的调用
}
printf("\nQueued successfully!\n\n");
printf("Print the queue:");
QueuePrintAll(Q); //输出队列序列 函数的调用
printf("\n\nQueueDelete now...");
while(QueueNotEmpty(Q)){ //判断非空否 函数的调用
QueueDelete(&Q , &d); //出队列操作 函数的调用
}
printf("\nQueueDelete successfully!\n\n");
printf("After QueueDelete:");
QueuePrintAll(Q); //输出队列序列 函数的调用
return 0;
}