隊列
隊列和棧一樣,都是一種線性結構,,它們都是操作受限制的線性表,其特殊性在於限制線性表的插入與刪除等操作的位置。
定義:
隊列是一種特殊的線性表,它包含一個對頭(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");
}