c语言队列的顺序存储实现

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

//队列的顺序存储实现 
typedef int Position;
struct QNode {
	int *Data;
	Position Front,Rear;//定义队列的头部以及尾部 
	int MaxSize;//数组的大小 
};
typedef struct QNode *Queue;

Queue CreateQueue(int MaxSize) {
	Queue Q = (Queue)malloc(sizeof(struct QNode));//为该队列分配一块内存空间 
	Q->Data = (int *)malloc(MaxSize * sizeof(int));//为数组分配一块内存空间 
	Q->Front = Q->Rear = 0;
	Q->MaxSize = MaxSize; 
	return Q;
}

bool IsFull(Queue Q) {
	/*队列的顺序存储的实现--理解关键之处:(Q->Rear + 1) % Q->MaxSize == Q->Front 
	该代码采取预留一个空位解决了(Front==Rear)时,对列是满还是空的问题。该公式就实现
	了该判断,(注意Front==Rear==0),并且当队列为满时,肯定是队列只剩余一个空位
	而Front总是指向该空位。(Front指向的位置一定没有元素,Rear总是指向队列尾部的最后一个元素 
	*/ 
	return ((Q->Rear + 1) % Q->MaxSize == Q->Front); 
}
bool AddQ(Queue Q, int x) {
	if (IsFull(Q)) {
		printf("队列满");
		return false;		 
	} else {
		Q->Rear = (Q->Rear + 1) % Q->MaxSize;
		Q->Data[Q->Rear] = x;
		return true;
	}
}

bool IsEmpty(Queue Q) {
	return (Q->Front == Q->Rear);
}

int DeleteQ(Queue Q) {
	if (IsEmpty(Q)) {
		printf("队列空");
//		return ERROR; 
	} else {
		Q->Front = (Q->Front+1) % Q->MaxSize;
		return Q->Data[Q->Front];
	}	
} 

//定义一个显示队列的方法
void showQueue(Queue Q){
	//判断是否为空
	if(IsEmpty(Q)) {
		printf("队列为空,不能显示数据");
		return; 
	}
	//遍历数组,显示数据
	/*
	(Q->Rear+Q->MaxSize-Q->Front) % Q->MaxSize):
	该语句计算出Front与Rear相差多少,加上一个Q->Front,就为i设定了边界值 
	*/
	for (int i = Q->Front + 1; i <= Q->Front + ((Q->Rear+Q->MaxSize-Q->Front) % Q->MaxSize); i++) {
		printf("Q->Data[%d] = %d\n",i%Q->MaxSize,Q->Data[i%Q->MaxSize]);//取模运算的奇妙之处 
	}
} 
int main(void) {
	
	Queue Q = CreateQueue(5);
	printf("直接显示数据Test:因为预留了一个位置,队列只能增加4个元素(队里数组大小为5):\n"); 
	AddQ(Q,1);
	AddQ(Q,2);
	AddQ(Q,3);
	AddQ(Q,4);
	showQueue(Q);
	 
	printf("队列满Test:\n"); 
	AddQ(Q,5);
	
	printf("\n元素出队列Test:\n"); 
	printf("出队列值:%d\n",DeleteQ(Q));
	printf("出队列值:%d\n",DeleteQ(Q));
	printf("出队列值:%d\n",DeleteQ(Q));
	printf("出队列值:%d\n",DeleteQ(Q));
	printf("\n空队列显示Test:\n");
	DeleteQ(Q); 
	return 0;
}

输出:

直接显示数据Test:因为预留了一个位置,队列只能增加4个元素(队里数组大小为5):
Q->Data[1] = 1
Q->Data[2] = 2
Q->Data[3] = 3
Q->Data[4] = 4
队列满Test:
队列满
元素出队列Test:
出队列值:1
出队列值:2
出队列值:3
出队列值:4

空队列显示Test:
队列空
--------------------------------
Process exited after 0.06129 seconds with return value 0
请按任意键继续. . .
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值