順序隊列

隊列

隊列和棧一樣,都是一種線性結構,,它們都是操作受限制的線性表,其特殊性在於限制線性表的插入與刪除等操作的位置。

定義:

隊列是一種特殊的線性表,它包含一個對頭(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");
}


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