2.循环顺序队列
- 需求分析:
创建循环顺序队列,并实现基本的相关操作 - 概要设计:
- 抽象数据结构:
ADT{
InitQueue(SqCQueue &S) //初始化队列S
EnQueue(SqCQueue &S, Elemtype e) //元素e入列
DeQueue(SqCQueue &S, Elemtype &e) //队首元素出列,并用e记录
Print_Number(SqCQueue S) //打印当前队列中元素总数
Print_Rear(SqCQueue S) //打印队尾元素
Print_Front(SqCQueue S) //打印队首元素
}
- 程序用到的函数及层次关系:
main{
InitQueue()
EnQueue()
DeQueue()
Print_Number()
Print_Rear()
Print_Front()
}
- 主程序流程:
初始化顺序循环队列–>用户选择操作–>执行操作
- 详细设计:
- 定义循环顺序队列的结构体:
typedef int Elemtype;
typedef int Status;
typedef struct {//循环顺序队列的数据结构
Elemtype* base;
int front;
int rear;
int size;
}SqCQueue;
- 初始化顺序循环队列:
Status InitQueue(SqCQueue &S) {//初始化队列
S.base = (Elemtype*)malloc(maxsize*sizeof(Elemtype));
if (!S.base) {
printf("初始化队列失败!\n");
return 0;
}
S.front = S.rear = 0;
S.size = 0;
printf("初始化队列成功!\n");
return 1;
}
- 定义入列函数:
- 队列判满:(S.rear+1)!=S.front
- 入列:S.rear=(S.rear+1)%maxsize
Status EnQueue(SqCQueue &S, Elemtype e) {//入列
if ((S.rear + 1) % maxsize == S.front) {
printf("队列已满!\n");
return 0;
}
S.base[S.rear] = e;
S.rear = (S.rear + 1) % maxsize;
S.size++;
printf("入列成功!\n");
return 1;
}
}
- 定义出列函数:
- 队列判空:S.rear!=S.front
- 出列:S.front=(S.front+1)%maxsize
Status DeQueue(SqCQueue &S, Elemtype &e)//出列
{
if (S.rear == S.front)
{
printf("队列为空!");
return 0;
}
e = S.base[S.front];
S.front = (S.front + 1) % maxsize;
S.size--;
printf("出列成功!\n出列元素为%d\n", e);
return 1;
}
- 定义打印当前队列中元素总数的函数:
void Print_Number(SqCQueue S) {//打印当前队列中元素总数
printf("队列中元素总数为%d\n", S.size);
}
- 定义打印队尾元素的函数:
由于rear指向队尾元素的下一个,直接减1可能会为负值,所以要加上maxsize,然后还要取模
void Print_Rear(SqCQueue S) {//打印队尾元素
printf("队尾元素为%d\n", S.base[(S.rear - 1 + maxsize) % maxsize]);
}
- *定义打印队首元素的函数:
void Print_Front(SqCQueue S) {//打印队首元素
printf("队首元素为%d\n", S.base[S.front]);
}
4.完整代码:
#include <cstdio>
#include <cstdlib>
#define maxsize 20
typedef int Elemtype;
typedef int Status;
typedef struct {//循环顺序队列的数据结构
Elemtype* base;
int front;
int rear;
int size;
}SqCQueue;
Status InitQueue(SqCQueue &S) {//初始化队列
S.base = (Elemtype*)malloc(maxsize*sizeof(Elemtype));
if (!S.base) {
printf("初始化队列失败!\n");
return 0;
}
S.front = S.rear = 0;
S.size = 0;
printf("初始化队列成功!\n");
return 1;
}
Status EnQueue(SqCQueue &S, Elemtype e) {//入列
if ((S.rear + 1) % maxsize == S.front) {
printf("队列已满!\n");
return 0;
}
S.base[S.rear] = e;
S.rear = (S.rear + 1) % maxsize;
S.size++;
printf("入列成功!\n");
return 1;
}
Status DeQueue(SqCQueue &S, Elemtype &e)//出列
{
if (S.rear == S.front)
{
printf("队列为空!");
return 0;
}
e = S.base[S.front];
S.front = (S.front + 1) % maxsize;
S.size--;
printf("出列成功!\n出列元素为%d\n", e);
return 1;
}
void Print_Number(SqCQueue S) {//打印当前队列中元素总数
printf("队列中元素总数为%d\n", S.size);
}
void Print_Front(SqCQueue S) {//打印队首元素
printf("队首元素为%d\n", S.base[S.front]);
}
void Print_Rear(SqCQueue S) {//打印队尾元素
printf("队尾元素为%d\n", S.base[(S.rear - 1 + maxsize) % maxsize]);
}
int main() {
SqCQueue S;
int m;
Elemtype p, q;
InitQueue(S);
printf("1.入列\n2.出列\n3.打印队首元素\n4.打印队尾元素\n5.打印当前队列中元素总数\n6.结束\n");
printf("请选择操作:");
while (scanf_s("%d", &m) != EOF) {
switch (m) {
case 1:
printf("请输入入列元素的值:");
scanf_s("%d", &p);
EnQueue(S, p);
break;
case 2:
DeQueue(S, q);
break;
case 3:
Print_Front(S);
break;
case 4:
Print_Rear(S);
break;
case 5:
Print_Number(S);
break;
case 6:
return 0;
}
printf("-------------------------\n");
printf("1.入列\n2.出列\n3.打印队首元素\n4.打印队尾元素\n5.打印当前队列中元素总数\n6.结束\n");
printf("请选择操作:");
}
}