考研數據結構之隊列(3.3)——練習題之設計一個循環隊列,用front和rear分別作爲隊頭和隊尾指針,另外用一個標誌tag表示隊列是空還是不空來設計隊列的結構和相關基本運算算法(C表示)

題目

設計一個循環隊列,用front和rear分別作爲隊頭和隊尾指針,另外用一個標誌tag表示隊列是空還是不空,約定當tag爲0時隊空,當tag爲1時隊不空,這樣就可以用front==rear作爲隊滿的條件要求,設計隊列的結構和相關基本運算算法(隊列元素是int型)。

分析

結構體定義:

/* 順序隊類型定義 */
typedef struct {
	int data[maxSize];
	int front;// 隊首指針
	int rear;// 隊尾指針
	int tag;// 表示隊列是空還是不空,約定tag=0時隊空,tag=1時隊不空
} SqQueue;

要素:

  • qu.tag=0;qu.front=qu.rear=0;// 初始時
  • qu.front==qu.rear&&qu.tag==0;// 隊空條件
  • qu.front==qu.rear&&qu.tag==1;// 隊滿條件

對於tag值的設置,初始時一定爲0,插入成功後應設置爲1,刪除成功後應設置爲0.因爲只有在插入操作後,隊列纔有可能滿,在刪除操作後,隊列纔有可能空。tag 的值再配合上front==rear這一句的判斷就能正確區分隊滿與隊空。

代碼

核心代碼:

/* 初始化隊列 */
void initQueue(SqQueue &qu) {
	qu.front=0;// 隊首和隊尾指針重合並指向0
	qu.rear=0;
	qu.tag=0;// 標誌位表示隊空
}

/* 判斷隊空 */
int isQueueEmpty(SqQueue qu) {
	if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示隊空
		return 1;// 1表示判斷結果爲空
	} else {
		return 0;// 0表示判斷結果爲非空
	}
}

/* 判斷隊滿 */
int isQueueFull(SqQueue qu) {
	if(qu.tag==1&&qu.front==qu.rear) { // 由於有標誌位tag,故可以用此等式判斷是否隊滿
		return 1;
	} else {
		return 0;
	}
}

/* 入隊 */
int enQueue(SqQueue &qu,int x) {
	if(isQueueFull(qu)==1) {
		return 0;
	} else {
		qu.rear=(qu.rear+1)%maxSize;// 若隊未滿,則移動指針
		qu.data[qu.rear]=x;// 再存入元素
		qu.tag=1;// 只要進隊就將tag設置爲1,因爲只有進隊纔可能會發生隊滿
		return 1;
	}
}

/* 出隊 */
int deQueue(SqQueue &qu,int &x) {
	if(isQueueEmpty(qu)==1) { // 若隊空,則不能出隊
		return 0;
	} else {
		qu.front=(qu.front+1)%maxSize;// 若隊不空,則移動指針
		x=qu.data[qu.front];// 再取出元素
		qu.tag=0;// 只要有元素出隊,就把tag置爲0,因爲只有出隊纔可能隊空
		return 1;
	}
}

完整代碼:

#include<stdio.h>

#define maxSize 20

/* 順序隊類型定義 */
typedef struct {
	int data[maxSize];
	int front;// 隊首指針
	int rear;// 隊尾指針
	int tag;// 表示隊列是空還是不空,約定tag=0時隊空,tag=1時隊不空
} SqQueue;

/* 初始化隊列 */
void initQueue(SqQueue &qu) {
	qu.front=0;// 隊首和隊尾指針重合並指向0
	qu.rear=0;
	qu.tag=0;// 標誌位表示隊空
}

/* 判斷隊空 */
int isQueueEmpty(SqQueue qu) {
	if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示隊空
		return 1;// 1表示判斷結果爲空
	} else {
		return 0;// 0表示判斷結果爲非空
	}
}

/* 判斷隊滿 */
int isQueueFull(SqQueue qu) {
	if(qu.tag==1&&qu.front==qu.rear) { // 由於有標誌位tag,故可以用此等式判斷是否隊滿
		return 1;
	} else {
		return 0;
	}
}

/* 入隊 */
int enQueue(SqQueue &qu,int x) {
	if(isQueueFull(qu)==1) {
		return 0;
	} else {
		qu.rear=(qu.rear+1)%maxSize;// 若隊未滿,則移動指針
		qu.data[qu.rear]=x;// 再存入元素
		qu.tag=1;// 只要進隊就將tag設置爲1,因爲只有進隊纔可能會發生隊滿
		return 1;
	}
}

/* 出隊 */
int deQueue(SqQueue &qu,int &x) {
	if(isQueueEmpty(qu)==1) { // 若隊空,則不能出隊
		return 0;
	} else {
		qu.front=(qu.front+1)%maxSize;// 若隊不空,則移動指針
		x=qu.data[qu.front];// 再取出元素
		qu.tag=0;// 只要有元素出隊,就把tag置爲0,因爲只有出隊纔可能隊空
		return 1;
	}
}

/* 打印隊列 */
void printQueue(SqQueue qu) {
	printf("\n");
	while(qu.rear!=qu.front) {
		qu.front=(qu.front+1)%maxSize;
		printf("%d\t",qu.data[qu.front]);
	}
	printf("\n");
}

int main() {
	SqQueue qu;
	int nums[]= {1,2,3,4,5,6};
	int n=6;
	for(int i=0; i<n; i++) {
		int m=enQueue(qu,nums[i]);// 將數組中的元素入隊
	}
	printQueue(qu);// 打印隊列

	int x;
	deQueue(qu,x);// 將元素1出隊
	printQueue(qu);// 打印隊列
	return 0;
}

運行結果:

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