1. 程式人生 > >資料結構----佇列的操作

資料結構----佇列的操作

佇列的定義:佇列簡稱隊,它是一種運算受控的線性表,其限制為僅允許在標的一段進行插入,在表的另一端進行刪除。可進行插入的是隊尾,可進行刪除的是隊頭 佇列中插入元素稱為進隊,新元素進隊後稱為新的隊尾元素,從佇列中刪除元素稱為出隊,元素出隊後,其後繼元素成為新的隊頭元素。

佇列的特點:先進先出(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,入隊

【演算法描述】

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;
}
4,出隊

【演算法描述】

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);  
      
}