队列
队列和栈一样,都是一种线性结构,,它们都是操作受限制的线性表,其特殊性在于限制线性表的插入与删除等操作的位置。
定义:
队列是一种特殊的线性表,它包含一个对头(front)和一个队尾(rear)。其中,队头只允许删除元素,队尾只允许插入元素。特点是先进先出(FIFO)。
抽象数据类型
1:数据对象集合
队列的数据对象集合为{a1,a2,……an},每个元素的的类型都是DataType。队列也是一种线性表。
2:基本操作集合
(1):InitQueue(&Q):初始化操作。建立一个空队列Q。
(2):QueueEmpty(Q):若队列为空,返回1,否则,返回0
(3):EnterQueue(&Q,X):插入元素X到队列Q队尾中
(4):DeleteQueue(&Q,&e):删除元素队列Q队首,并用e返回其值。
(5):Gethead(Q,&e):用e返回Q的队首元素。
(6):ClearQueue(&Q):将队列Q清空。
队列的顺序存储
顺序队列通常采用一位数组进行存储。连续的存储单元依次存放在队列中的元素。同时,使用2个指针分别表示数组中存放的第一个元素和最后一个元素的位置。
其中,指向第一个元素的位置的指针为队头指针front,指向最后一个元素的位置的指针为队尾指针rear。
用c语言描述如下
#define QueueSize 40 //队列的容量
typedef struct Squeue{
DataTypequeue[QueueSize];
Intfront,rear; //队头和队尾
}
顺序队列的实现
为了方便c语言的表示,我们约定:初始化建立空队列时,front = rear = 0;队头指针和队尾指针指向队列的第一个位置。插入新元素时
队尾指针rear 加1,删除元素时,队头指针front加1。队列非空时,队头指针front 指向队头元素的位置,队尾指针rear指向队尾元素所在位置的下一个位置。
(1):队列的初始化操作
//队列的初始化操作
void InitQueue(SeqQueue *SQ)
{
SQ->front = SQ->rear = 0; //把队头的指针和队尾的指针设为0
}
(2):判断队列是否为空
//判断队列是否为空,是则返回1,否则返回0
int QueueEmpty(SeqQueue SQ)
{
if(SQ.front == SQ.rear) //判断队头的指针是否和队尾的一样
return 1;
else
return 0;
}
(3):入队操作
//入队操作,将元素x插入队尾,成功返回1,失败返回0
int EnterQueue(SeqQueue *SQ,DataType x)
{
if(SQ->rear == QueueSize) //插入元素前检查队列是否已满
return 0;
SQ->queue[SQ->rear] = x; //在队尾插入元素
SQ->rear = SQ->rear + 1; //将队尾指针后移一位
return 1;
}
(4):出队操作
//出队操作
int DeleteQueue(SeqQueue *SQ,DataType *e)
{
if(SQ->front == SQ->rear) //删除元素前检查队列是否已空
return 0;
else
{
*e = SQ->queue[SQ->front]; //将删除的元素付给e
SQ->front = SQ->front + 1; //将队头指针后移一位
return 1;
}
}
(5):取头元素操作
//用e返回队头元素
int GetHead(SeqQueue SQ,DataType *e)
{
if(SQ.front == SQ.rear) //删除元素前检查队列是否已空
return 0;
else
{
*e = SQ.queue[SQ.front]; //用e返回队头元素
return 1;
}
}
(6):将队列清空操作
//清空队列
void ClearQueue(SeqQueue *SQ)
{
SQ->front = SQ->rear = 0;
}
实例:
编程实现顺序队列的入队和出队操作,将结果输出。
#include <stdio.h>
#include "SeqQueue.h"
void main()
{
SeqQueue Q; //声明一个顺序队列Q
char str[] = "ABCDEFG";
int i,length = 7;
DataType x;
InitQueue(&Q); //初始化顺序队列
for(i=0; i<length; i++ )
{
EnterQueue(&Q,str[i]);
}
DeleteQueue(&Q,&x); //将队头元素出队列
printf("出队列的元素是:%c\n",x);
printf("顺序队列的元素为:");
if(!QueueEmpty(Q)) //判断顺序表是否为空
{
for(i=Q.front; i<Q.rear; i++)
printf("%c",Q.queue[i]); //输出队头指针到队尾指针的元素
}
printf("\n");
}