队列,先进先出
目录
预先要引用的头文件以及宏定义
#include<stdio.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
所使用的循环队列的结构
typedef struct {
ElemType* elem; //存储空间基址
int front; //队头位标
int rear; //队尾位标(指向队尾的下一个元素)
int maxSize; //存储容量
}SqQueue;
队列判空判满不能直接用Q.front==Q.rear来判断,这样很不方便,故有如下选择
(1)设置一个标志域标识队列空或满
(2)设一个长度域记录队列中的元素个数
(3)少用一个元素空间,一旦Q.front==(Q.rear+1)%Q.maxSize则认为队满
本人采用(3)
其基本操作接口
Status InitQueue_Sq(SqQueue& Q, int size); //构造一个空队列Q,最大长度为size
Status DestroyQueue_Sq(SqQueue& Q); //销毁队列Q
void ClearQueue_Sq(SqQueue& Q); //将Q置为空队列
Status QueueEmpty_Sq(SqQueue Q); //若队列为空TRUE 否则 ERROR
int QueueLength_Sq(SqQueue Q); //返回队列长度
Status GetHead_Sq(SqQueue Q, ElemType& e); //若队列不空,返回Q队列的头元素到e,并返回OK,否则ERROR
Status EnQueue_Sq(SqQueue& Q, ElemType e); //在队尾元素之后插入元素e;
Status DeQueue_Sq(SqQueue& Q, ElemType& e); //若队列不为空,删除当前头元素并用e返回其值,而后返回OK,否则ERROR
构造一个空队列Q,最大长度为size(队列初始化)
Status InitQueue_Sq(SqQueue& Q, int size)
{
Q.elem = (ElemType*)malloc(size * sizeof(ElemType));
if (Q.elem == NULL)
{
return OVERFLOW;
}
else
{
Q.maxSize = size;
Q.front = Q.rear = 0;
return OK;
}
}
销毁队列
Status DestroyQueue_Sq(SqQueue& Q)
{
if (Q.elem)
{
delete(Q.elem);
Q.maxSize = 0;
Q.rear = Q.front = 0;
return OK;
}
else
{
return ERROR;
}
}
队列清空
void ClearQueue_Sq(SqQueue& Q)
{
if (Q.elem)
{
Q.rear = Q.front = 0;
}
}
队列判空
Status QueueEmpty_Sq(SqQueue Q)
{
if (Q.rear == Q.front)
{
return TRUE;
}
else
{
return ERROR;
}
}
返回队列长度
int QueueLength_Sq(SqQueue Q)
{
int num=0;
if (Q.rear > Q.front)
{
num = Q.rear - Q.front;
}
else if (Q.rear < Q.front)
{
num = Q.maxSize - Q.front + Q.rear;
}
return num;
}
返回Q队列的头元素
Status GetHead_Sq(SqQueue Q, ElemType& e)
{
if (Q.rear!=Q.front)
{
e = Q.elem[Q.front];
return OK;
}
else
{
return ERROR;
}
}
入队
Status EnQueue_Sq(SqQueue& Q, ElemType e)
{
if ((Q.rear + 1) % (Q.maxSize) == Q.front)
{
return ERROR;
}
else
{
Q.elem[Q.rear] = e;
Q.rear = (Q.rear + 1) % Q.maxSize;
return OK;
}
}
出队
Status DeQueue_Sq(SqQueue& Q, ElemType& e)
{
if (Q.front == Q.rear)
{
return ERROR;
}
else
{
e = Q.elem[Q.front];
Q.front = (Q.front + 1) % Q.maxSize;
return OK;
}
}
一些接口的测试
int main()
{
SqQueue Q;
InitQueue_Sq(Q, 5);
for (int i = 0; i < 5; i++)
{
cout << i;
cout<<QueueLength_Sq(Q)<<endl;
EnQueue_Sq(Q, i);
}
cout << QueueLength_Sq(Q) << endl;
cout << QueueEmpty_Sq(Q) << endl;
for (int j = 0; j < 5; j++)
{
int num = 0;
int num1 = 0;
GetHead_Sq(Q, num1);
cout << num1;
DeQueue_Sq(Q, num);
cout << num<<endl;
}
cout<<QueueEmpty_Sq(Q)<<endl;
cout<<QueueLength_Sq(Q);
DestroyQueue_Sq(Q);
}