循环顺序队列

2.循环顺序队列

  1. 需求分析:
    创建循环顺序队列,并实现基本的相关操作
  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()
}

  • 主程序流程:
    初始化顺序循环队列–>用户选择操作–>执行操作
  1. 详细设计:
  • 定义循环顺序队列的结构体:
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;
}
  • 定义入列函数:
  1. 队列判满:(S.rear+1)!=S.front
  2. 入列: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;
}
}
  • 定义出列函数:
  1. 队列判空:S.rear!=S.front
  2. 出列: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("请选择操作:");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值