队列(顺序存储)基础操作

循环队列(静态分配),结构体定义了一个头指针,一个尾指针,为了判断队空队满,并将其区分,我们需要浪费一个存储空间。使

判断队空的条件为:Q.rear=Q.front

判断队满的条件为:(Q.rear+1)%MaxSize ==Q.front

队长为:(Q.rear+MaxSize-Q.front)%MaxSize

这里的代码初始化后我直接用了一个循环,用入队操作来创建队列,输入9999结束输入。

//循环队列
//为了判断队空和队满,需要浪费一个存储空间
/**/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int front, rear;//队头指针,队尾指针
}SqQueue;
//1.初始化
bool InitQueue(SqQueue& Q) {
	Q.rear = Q.front = 0;
	return true;
}
//2.判断队空
bool QueueEmpty(SqQueue Q) {
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}
//3.判断队满
bool QueueFull(SqQueue Q) {
	if ((Q.rear + 1) % MaxSize == Q.front)
		return true;
	else
		return false;
}
//4.获取队列的长度
int QueueLength(SqQueue& Q) {
	if (Q.front == Q.rear)
		printf("队列为空!\n");
	else
		return ((Q.rear + MaxSize - Q.front) % MaxSize);
}
//5.入队
bool EnQueue(SqQueue& Q, ElemType x) {
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1)%MaxSize;
	return true;
}
//6.出队
bool DeQueue(SqQueue& Q, ElemType& x) {
	if (Q.rear == Q.front)//判断队空
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;//队头指针后移
	return true;
}
//7.获取队头元素的值
bool GetTop(SqQueue& Q, ElemType &x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	return true;
}
//8.打印队列
void PrintQueue(SqQueue Q) {
	int i;
	printf("要打印的队列为:\n");
	//for (i = 0; i < (Q.rear - Q.front)%MaxSize; i++)
	for (i = Q.front; i < Q.rear;i++)
		printf("%d ",Q.data[i]);
	printf("\n");
}
int main() {

	SqQueue Q;
	int x, e, headelem,i;
	//InitQueue(Q);
	int command;
	while (1) {
		printf("*******************************\n");
		printf("下面是操作界面\n");
		printf("1.队列的初始化                        2.判断队空\n");
		printf("3.判断队满                            4.队列的长度\n");
		printf("5.入队                                6.出队\n");
		printf("7.取队头元素                           8.退出\n");
		printf("*******************************\n");
		printf("请输入您要进行的操作:\n");
		scanf_s("%d", &command);
		switch (command)
		{
		case 1:
			//1.队列的初始化
			InitQueue(Q);
			if (InitQueue(Q) == 1) printf("初始化成功!\n"); else printf("初始化失败!\n");
			printf("请依次输入队列中元素:\n");
			scanf_s("%d", &x);
			while (x != 9999) {
				EnQueue(Q, x);
				scanf_s("%d", &x);
			}
			break;
		case 2:
			//2.判断队空
			if (QueueEmpty(Q) == 1) printf("队列为空!\n"); else printf("队列不空!\n");
			break;
		case 3:
			//3.判断队满  
			if (QueueFull(Q) == 1) printf("队列满!\n"); else printf("队列不满!\n");
			break;
		case 4:
			//4.队列的长度
			printf("队列的长度为:%d\n", QueueLength(Q));
			break;
		case 5:
			//5.入队
			printf("请输入要入队的元素值:\n");
			scanf_s("%d", &i);
			EnQueue(Q, i);
			break;
		case 6:
			//6.出队
			DeQueue(Q, e);
			printf("出队的元素为:%d\n", e);
			break;
		case 7:
			//7.取队头元素
			GetTop(Q, headelem);
			printf("队头元素为:%d\n", headelem);
			break;
		case 8:
			//退出
			break;
		default:
			printf("输入错误\n");
			break;
		}
		PrintQueue(Q);
		printf("\n");

	}
	return 0;
}

为了不浪费存储空间,我们有两种解决办法,第一种是可以用在结构体定义中设置一个int size变量,初始化置为0,。每进行一次入队操作size++,每进行一次出队操作size--。

此时size==0为队空,size==MaxSize为队满,size的值即为队列的长度

//循环队列(不浪费存储空间)
//设置一个size变量,初始化为0,每进行一次入队操作size++。每进行一次出队操作size--。
/**/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int front, rear;//队头指针,队尾指针
	int size;//队列当前长度
}SqQueue;
//初始化
bool InitQueue(SqQueue& Q) {
	Q.rear = Q.front = 0;
	Q.size = 0;
	return true;
}
//判断队空
bool QueueEmpty(SqQueue Q) {
	if (Q.size==0)
		return true;
	else
		return false;
}
//判断队满
bool QueueFull(SqQueue Q) {
	if (Q.size==MaxSize)
		return true;
	else
		return false;
}

/*获取队列的长度(忽略)
int QueueLength(SqQueue& Q) {
	if (Q.front == Q.rear)
		printf("队列为空!\n");
	else
		return ((Q.rear + MaxSize - Q.front) % MaxSize);
}*/
int QueueLength(SqQueue& Q) {
	return Q.size;
}
//入队
bool EnQueue(SqQueue& Q, ElemType x) {
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	Q.size++;
	return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType& x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	Q.size--;
	return true;
}
//获取队头元素的值
bool GetTop(SqQueue& Q, ElemType& x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	return true;
}
//打印队列
void PrintQueue(SqQueue& Q) {
	int i;
	printf("要打印的队列为:\n");
	for (i = Q.front; i < Q.size; i++) {
		printf("%d ", Q.data[i]);
	}
	printf("\n");
}

int main() {

	SqQueue Q;
	int x, e, headelem, i;
	//InitQueue(Q);
	int command;
	while (1) {
		printf("*******************************\n");
		printf("下面是操作界面\n");
		printf("1.队列的初始化                        2.判断队空\n");
		printf("3.判断队满                            4.队列的长度\n");
		printf("5.入队                                6.出队\n");
		printf("7.取队头元素                           8.退出\n");
		printf("*******************************\n");
		printf("请输入您要进行的操作:\n");
		scanf_s("%d", &command);
		switch (command)
		{
		case 1:
			//1.队列的初始化
			InitQueue(Q);
			if (InitQueue(Q) == 1) printf("初始化成功!\n"); else printf("初始化失败!\n");
			printf("请依次输入队列中元素:\n");
			scanf_s("%d", &x);
			while (x != 9999) {
				EnQueue(Q, x);
				scanf_s("%d", &x);
			}
			break;
		case 2:
			//2.判断队空
			if (QueueEmpty(Q) == 1) printf("队列为空!\n"); else printf("队列不空!\n");
			break;
		case 3:
			//3.判断队满  
			if (QueueFull(Q) == 1) printf("队列满!\n"); else printf("队列不满!\n");
			break;
		case 4:
			//4.队列的长度
			printf("队列的长度为:%d\n", QueueLength(Q));
			break;
		case 5:
			//5.入队
			printf("请输入要入队的元素值:\n");
			scanf_s("%d", &i);
			EnQueue(Q, i);
			break;
		case 6:
			//6.出队
			DeQueue(Q, e);
			printf("出队的元素为:%d\n", e);
			break;
		case 7:
			//7.取队头元素
			GetTop(Q, headelem);
			printf("队头元素为:%d\n", headelem);
			break;
		case 8:
			//退出
			break;
		default:
			printf("输入错误\n");
			break;
		}
		PrintQueue(Q);
		printf("\n");

	}
	return 0;
}

第二种方法:在结构体中设置一个tag变量,初始化为0,每进行一次入队操作tag置为1,每进行一次出队操作tag置为0.

此时队空的条件是:Q.rear==Q.front&&Q.tag==0

此时队满的条件是:Q.rear==Q.front&&Q.tag==1

队长:(Q.rear + MaxSize - Q.front) % MaxSize

//循环队列(不浪费存储空间)
/*在定义结构体的时候加一个tag变量
每次进行入队操作将tag置为1,每次进行出队操作将tag置为0。
1.当Q.front==Q.rear&&tag=1时,说明最后一次进行的操作是入队操作,则这时队列满
2.当Q.front==Q.rear&&tag=0时,说明最后一次进行的操作时出队操作,则这时队列空
*/
/**/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int front, rear;//队头指针,队尾指针
	int tag;
}SqQueue;
//初始化
bool InitQueue(SqQueue& Q) {
	Q.rear = Q.front = 0;
	Q.tag = 0;
	return true;
}
//判断队空
bool QueueEmpty(SqQueue Q) {
	if ((Q.front == Q.rear)&&Q.tag==0)
		return true;
	else
		return false;
}
//判断队满
bool QueueFull(SqQueue Q) {
	if ((Q.front == Q.rear) && Q.tag == 1)
		return true;
	else
		return false;
}
//获取队列的长度
int QueueLength(SqQueue& Q) {
	if (Q.front == Q.rear)
		printf("队列为空!\n");
	else
		return ((Q.rear + MaxSize - Q.front) % MaxSize);
}
//入队
bool EnQueue(SqQueue& Q, ElemType x) {
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	Q.tag = 1;
	return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType& x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	Q.tag = 0;
	return true;
}
//获取队头元素的值
bool GetTop(SqQueue& Q, ElemType& x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	return true;
}
//打印队列
void PrintQueue(SqQueue& Q) {
	int i;
	printf("要打印的队列为:\n");
	for (i = Q.front; i < Q.rear; i++) {
		printf("%d ", Q.data[i]);
	}
	printf("\n");
}
int main() {

	SqQueue Q;
	int x, e, headelem, i;
	//InitQueue(Q);
	int command;
	while (1) {
		printf("*******************************\n");
		printf("下面是操作界面\n");
		printf("1.队列的初始化                        2.判断队空\n");
		printf("3.判断队满                            4.队列的长度\n");
		printf("5.入队                                6.出队\n");
		printf("7.取队头元素                           8.退出\n");
		printf("*******************************\n");
		printf("请输入您要进行的操作:\n");
		scanf_s("%d", &command);
		switch (command)
		{
		case 1:
			//1.队列的初始化
			InitQueue(Q);
			if (InitQueue(Q) == 1) printf("初始化成功!\n"); else printf("初始化失败!\n");
			printf("请依次输入队列中元素:\n");
			scanf_s("%d", &x);
			while (x != 9999) {
				EnQueue(Q, x);
				scanf_s("%d", &x);
			}
			break;
		case 2:
			//2.判断队空
			if (QueueEmpty(Q) == 1) printf("队列为空!\n"); else printf("队列不空!\n");
			break;
		case 3:
			//3.判断队满  
			if (QueueFull(Q) == 1) printf("队列满!\n"); else printf("队列不满!\n");
			break;
		case 4:
			//4.队列的长度
			printf("队列的长度为:%d\n", QueueLength(Q));
			break;
		case 5:
			//5.入队
			printf("请输入要入队的元素值:\n");
			scanf_s("%d", &i);
			EnQueue(Q, i);
			break;
		case 6:
			//6.出队
			DeQueue(Q, e);
			printf("出队的元素为:%d\n", e);
			break;
		case 7:
			//7.取队头元素
			GetTop(Q, headelem);
			printf("队头元素为:%d\n", headelem);
			break;
		case 8:
			//退出
			break;
		default:
			printf("输入错误\n");
			break;
		}
		PrintQueue(Q);
		printf("\n");

	}
	return 0;
}

文章结束了,点个赞再走,后续队列的其他操作会在这个文章补充的。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的光电人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值