題目
如果允許在循環隊列的兩端都可以進行插入和刪除操作,寫出從隊尾刪除和從隊頭插入的算法。
分析
用一維數組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;
}
允許結果: