考研數據結構之隊列(3.3)——練習題之如果運行在循環隊列的兩端都可以進行插入和刪除操作,寫出從隊尾刪除和從隊頭插入的算法(C表示)

題目

如果允許在循環隊列的兩端都可以進行插入和刪除操作,寫出從隊尾刪除和從隊頭插入的算法。

分析

用一維數組data[0,.... maxSize 1]實現循環隊列,其中maxSize 是隊列長度。設置隊頭指針front和隊尾指針rear,約定front指向隊頭元素的前位置, rear指向隊尾元素。 定義滿足 front- rear時爲隊空。從隊尾刪除元素,則rear向着下標減小的方向行走:從隊頭插入元素,front 同樣向着下標減小的方向行走。因此,當滿足rear==(front-1+maxSize)%maxSize時隊滿。

從隊尾刪除和從隊頭插入的圖解:

從隊頭刪除和從隊尾刪除的圖解:

注意兩張圖的箭頭指向

代碼

核心代碼:

/* 入隊(從隊頭插入) */
/* &qu指的是要插入元素的隊列;x指的是要插入的元素 */
int enQueue(SqQueue &qu,int x) {
	if(qu.rear==(qu.front-1+maxSize)%maxSize) { // 如果隊滿,則不能入隊
		return 0;
	} else {
		/* 注意:這裏是先入隊,再修改指針 */
		qu.data[qu.front]=x;
		qu.front=(qu.front-1+maxSize)%maxSize;
		return 1;
	}
}

/* 出隊(從隊尾出隊)
/* &qu指的是要出隊的隊列;&x指的是要存儲出隊元素的值 */
int deQueue(SqQueue &qu,int &x) {
	if(qu.rear==qu.front) { // 如果隊空,就不能出隊了
		return 0;
	} else {
		/* 注意:這裏是先入隊,再修改指針 */
		x=qu.data[qu.rear];
		qu.rear=(qu.rear-1+maxSize)%maxSize;
		return 1;
	}
}

完整代碼:

#include<stdio.h>

#define maxSize 10

/* 順序隊類型定義 */
typedef struct {
	int data[maxSize];
	int front;// 隊首指針
	int rear;// 隊尾指針
} SqQueue;

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

/* 入隊(從隊頭插入) */
/* &qu指的是要插入元素的隊列;x指的是要插入的元素 */
int enQueue(SqQueue &qu,int x) {
	if(qu.rear==(qu.front-1+maxSize)%maxSize) { // 如果隊滿,則不能入隊
		return 0;
	} else {
		/* 注意:這裏是先入隊,再修改指針 */
		qu.data[qu.front]=x;
		qu.front=(qu.front-1+maxSize)%maxSize;
		return 1;
	}
}

/* 出隊(從隊尾出隊)
/* &qu指的是要出隊的隊列;&x指的是要存儲出隊元素的值 */
int deQueue(SqQueue &qu,int &x) {
	if(qu.rear==qu.front) { // 如果隊空,就不能出隊了
		return 0;
	} else {
		/* 注意:這裏是先入隊,再修改指針 */
		x=qu.data[qu.rear];
		qu.rear=(qu.rear-1+maxSize)%maxSize;
		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;
	initQueue(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;
}

允許結果:

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