1.队列的定义和特点
1.1队列是一种先进先出的线性表,只允许在一端插入一端删除元素,可以插入的一端为队尾,可以删除的一端是队头。
队列的进入顺序跟出队顺序是一致的。
2.队列的类型定义
InitQueue(&Q)//构造一个空队列
DestroyQueue(&Q)//销毁队列
ClearQueue(&Q)//清空队列
QueueEmpty(Q)//判断是否为空队列
QueueLength(Q)//计算队列的长度
GetHead(Q)//返回队头的元素
EnQueue(&Q,e)//在队尾插入元素
DeQueue(&Q,&e)//删除队头元素
QueueTraverse(Q)//访问队里的每个元素
3.队列的操作实现
3.1队列的顺序表示和实现
1)存储结构
#define MAXSIZE 100
#define OK 1
#define ERROR -1
#define NULL 0
typedef struct
{
QElemType *base;//一定要提前定义
int front;
int rear;
}SqQueue;
2)初始化
//初始化(分配一个较大的数组空间)
Status InitQueue(SqQueue &Q)//构造一个空队列
{
Q.base=new QElemType[MAXSIZE];//QElemType记得提前定义
if(!Q.base)
return ERROR;
Q.front=Q.rear=0;//头尾都是空时队列为空;
return OK;
}
3)求队列长度
//求队列的长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;//加上MAXSIZE的目的是为了防止前面为负数
}
4)入队
//入队(用的是尾指针)
Status EnQueue(SqQueue &Q,QEleType ,e)
{
if((Q.rear+1)%MAXSIZE==Q.front)//首先得判断队列是否已满
{
return ERROR;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;//先赋值,然后将尾指针后移
}
5)出队
//出队(用的是头指针),删除队头元素
Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear)//判断队是否是空;
return ERROR;
e=Q.base[Q.front];//先将值返回,然后再后移;
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
6)取队头元素
//取队头元素
QElemType GetHead(SqQueue Q)//没有将队头元素后移
{
if(Q.front!=Q.rear)//这里不能写他俩相等时返回什么值,不确定返回值得类型
{
return Q.base[Q.front];
}
}
3.2队列的链式表示和实现
1)存储结构
//储存结构
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
2)初始化(构造一个空节点)
//初始化(构造一个空队列)
Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
3)入队
//入队
Status EnQueue(LinkQueue &Q,QElemType e)//在队尾插入元素
{
p=new QNode;
p->data=e;
Q.rear->next=p;
p->next=NULL;
Q.rear=p;//记得修改队尾指针
return OK;
}
4)出队
//出队
Status DeQueue(LinkQueue &Q,QElemType &e)//删除队头元素
{
if(Q.front==Q.rear)//这个需要判断队是否为空
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;//修改头指针的指针域
if(Q.rear==p)
{
Q.front=Q.rear;//易忘
}
delete p;
return OK;
}
5)取队头元素
//取队头元素
QElemType GetHead(LinkQueue Q)
{
if(Q.front!=Q.rear)
{
return Q.front->next->data;
}
}
跟栈特别类似,就是特点不同,根据特点不同做出变化即可。