顺序队列

队列

队列和栈一样,都是一种线性结构,,它们都是操作受限制的线性表,其特殊性在于限制线性表的插入与删除等操作的位置。

定义:

队列是一种特殊的线性表,它包含一个对头(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");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章