SQeueue 循环线性队列,不允许超过maxsize,需debug,有批注,C语言.cpp文件

因为其属于只动前后的部分,并不用大规模移动,所以使用线性队列,放弃链式队列(因为会占用大量的链式存储空间。)

//使用.cpp文件,编写队列,本出实现循环队列queue。
//类似于会计的    LIFO 原则。
#include<stdio.h>
#include<malloc.h>
#define OVERFLOW -1
#define ERROR -2
#define _CRT_SECURE_NO_WARNINGS_
#define ElemType char
#define TRUE 1
#define FALSE 0
#define OK 2
#define InitMaxSize 100
#define status int

typedef struct Queue
{
	ElemType* base;
	int front;
	int rear;
}SqQueue;

status InitQueue(SqQueue &S)
{
	S.base = (ElemType*)malloc(InitMaxSize * sizeof(ElemType));
	if (!S.base) return OVERFLOW;
	S.rear = 0;
	S.front = 0;
	return OK;
}
status DestoryQueue(SqQueue& S)
{
	free(S.base);
	return OK;
}//销毁一个队列,直接释放内存。
status ClearQueue(SqQueue& S)
{
	S.front = 0;
	S.rear = 0;
	return OK;
}//清空一个队列中所有元素,本处直接让它们变成非法的。
int QueueEmpty(SqQueue &S)
{
	if (S.front == S.rear) return TRUE;
	else return FALSE;
}//判断一个队列是否为空的。如果是空的,返回TURE,否则返回FALSE
int QueueLength(SqQueue& S)
{
	int len = S.rear - S.front;
	return len;
}//求队的长度并进行赋值。
status QueueTraverse(SqQueue &S)
{
	for (int i = 0; i < QueueLength(S); i++)
	{
		if (!S.base[S.rear + i]) return ERROR;
	}
	return OK;
}//使用函数遍历所有数据,从头结点开始向后进行遍历
status GetHead(SqQueue& S, ElemType* e)
{
	*e = (S.base[S.front]);
	return OK;
}//使用指针e返回队列的第一个元素。
status EnQueue(SqQueue& S,ElemType e)
{
	if ((S.rear + 1) % InitMaxSize == S.front) return ERROR;
	S.base[S.rear] = e;
	S.rear = (S.rear + 1) % InitMaxSize;
	return OK;
}/*
 如果队满了,再进行enqueue就直接报错了,这个好,不惯毛病。
 判断队满的方式为让front-1=rear%maxsize
 相当于循环队列进行循环时整体移动到最开头的地方,然后进行比较
 +1是因为如果不加1,那莫队满的标志和队空的标志就变成了一个东西,这是产生二义性的,不被允许的。
 */
/*同时,(S.rear + 1) % InitMaxSize使其一直在规定的范围之中进行循环,防止访问非法地址*/
status DeQueue(SqQueue& S, ElemType* e)
{
	*e = S.base[S.front];
	S.front = (S.front + 1) % InitMaxSize;
	return OK;
}//去除队列之中的第一个元素,front++,让第一个元素变成非法元素就行了。
int main()
{
	return 0;
}

其中状态等使用宏定义完成。需要改动的时候直接改动就行

同时,元素不得超过InitSqeueSize,否则直接报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值