因为其属于只动前后的部分,并不用大规模移动,所以使用线性队列,放弃链式队列(因为会占用大量的链式存储空间。)
//使用.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,否则直接报错。