資料結構----佇列的操作
阿新 • • 發佈:2019-01-08
佇列的定義:佇列簡稱隊,它是一種運算受控的線性表,其限制為僅允許在標的一段進行插入,在表的另一端進行刪除。可進行插入的是隊尾,可進行刪除的是隊頭。 向佇列中插入元素稱為進隊,新元素進隊後稱為新的隊尾元素,從佇列中刪除元素稱為出隊,元素出隊後,其後繼元素成為新的隊頭元素。
佇列的特點:先進先出(FIFO)
佇列的儲存結構:順序隊與鏈隊
一,順序隊
佇列的順序儲存結構表示:
#define maxsize 100 //佇列可能達到的最大長度 typedef struct { int data[maxsize]; int front; //隊首指標 int rear; //隊尾指標 }SqQueue;
1,迴圈佇列的初始化
迴圈佇列的初始化操作就是動態分配一個大小為maxsize的陣列空間
①為佇列分配一個最大容量為maxsize的陣列空間,base指向陣列空間的首地址
②頭指標和尾指標置零,表示佇列為空
【演算法描述】
status InitQueue(SqQueue &q) {//構造一個空佇列Q Q.base=new QElemeType[maxsize]; // 為佇列分配一個最大容量為maxsize的陣列空間 if(!Q.base) exit(overflow); //儲存分配失敗 Q.front=Q.rear=0; //頭指標和尾指標置零 return ok; }
2,求迴圈佇列的長度
【演算法描述】
int QueueLength(SqQueue q)
{//返回Q的元素個數,即佇列的長度
return(Q.rear-Q.front+maxsize)%maxsize;
}
3,入隊
【演算法描述】
4,出隊status EnQueu(SqQueue &Q,QElemType) {//插入元素為Q的新的佇列元素 if((Q.rear+1)%maxsize==q.front) return error; Q.base[Q.rear]=e; //新元素插入隊尾 Q.rear=(q.rear+1)%maxsize //隊尾指標加1 return ok; }
【演算法描述】
status DeQueu(SqQueue &Q,QElemType)
{//插入元素為Q的新的佇列元素
if(Q.front==Q.rear) //隊空
return error;
Q.base[Q.front]=e; //新元素插入隊尾
Q.front=(q.front+1)%maxsize //隊尾指標加1
return ok;
}
5,取迴圈佇列的隊頭元素
SElemType GetHead(Squeue Q)
{//返回Q的隊頭元素,不修改隊頭指標
if(Q.rear==Q.front) //佇列不為空
return Q.base[Q.front]; //返回隊頭元素的值,隊頭指標不變
}
二,迴圈佇列的實現
#include<stdio.h>
#include<stdlib.h>
#define maxsize 50
typedef struct SqQueue{
int data[maxsize];
int front;//隊首指標
int rear;//隊尾指標
}SqQueue;
//建立迴圈佇列
SqQueue initQueue(){
SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue));
sq->rear=sq->front=0;
return *sq;
}
//判斷迴圈佇列是否為空
int isEmpty(SqQueue qu){
return (qu.front ==qu.rear?1:0);
}
//元素進迴圈佇列
int enQueue(SqQueue *qu,int x){
if((qu->rear+1)%maxsize ==qu->front){
return 0;
}
qu->rear=(qu->rear+1)%maxsize;
qu->data[qu->rear]=x;
return 1;
}
//元素出迴圈佇列
int deQueue(SqQueue *qu,int *y){
if(qu->rear ==qu->front){
return 0;
}
*y=qu->data[qu->front];
qu->front=(qu->front+1)%maxsize;
return 1;
}
//列印迴圈佇列
int printQueue(SqQueue qu){
if(qu.rear ==qu.front){
return 0;
}
while(qu.rear !=qu.front){
qu.front=(qu.front+1)%maxsize;
printf("當前佇列值=%d\n",qu.data[qu.front]);
}
return 1;
}
void main(){
int y=0;
SqQueue sq =initQueue();
enQueue(&sq,1);
enQueue(&sq,2);
enQueue(&sq,3);
enQueue(&sq,4);
deQueue(&sq,&y);
printQueue(sq);
printf("當前的front=%d\n",sq.front);
printf("當前的rear=%d\n",sq.rear);
}