在C語言中,.和->運算符用于訪問結構體的成員變量。它們之間的區別在于:.運算符用于訪問結構體變量的成員。->運算符用于訪問結構體指針變量的成員
1a(rear指向隊尾元素后一位,判空判滿時犧牲一個存儲單元)
首先我們考慮1a的情況下在犧牲一個存儲單元rear指向隊尾元素后一個位置該怎么實現隊列的基本操作,當rear指向隊尾元素的后一位時,隊列的實現需要犧牲一個存儲單元來區分隊列是空還是滿
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {Q->front = Q->rear = 0; // 初始時隊頭、隊尾指針指向0
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue* Q) {return Q->front == Q->rear; // 判空條件:隊頭指針等于隊尾指針
}// 判斷隊列是否已滿
bool QueueFull(SqQueue* Q) {return (Q->rear + 1) % MaxSize == Q->front; // 判滿條件:隊尾指針后移一位后等于隊頭指針
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判斷隊滿return false; // 隊滿報錯} else {Q->data[Q->rear] = x; // 新元素插入隊尾Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針后移return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯} else {Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移*x = Q->data[Q->front]; // 獲取隊頭元素return true;}
}// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯} else {*x = Q->data[Q->front]; // 獲取隊頭元素return true;}
}
在這個實現中,隊列滿的條件是隊尾指針后移一位后等于隊頭指針。這意味著隊列的實際容量是MaxSize - 1
,因為一個存儲單元被用來區分隊列是空還是滿。?
2a(rear指向隊尾元素,判空判滿時犧牲一個存儲單元)
當rear指向隊尾元素時,隊列的實現不需要犧牲額外的存儲單元來區分隊列是空還是滿。在這種情況下,隊列的實際容量就是MaxSize
,因為所有的存儲單元都可以用來存儲元素。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {// 初始時隊頭指針指向0// 隊尾指針指向數組尾元素Q->front = 0;Q->rear = MaxSize - 1;
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue* Q) {if (Q->rear == Q->front) { // 判空條件return true;} else {return false;}
}// 判斷隊列是否已滿
bool QueueFull(SqQueue* Q) {if ((Q->rear + 1) % MaxSize == Q->front) { // 判滿條件return true;} else {return false;}
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判斷隊滿return false; // 隊滿報錯} else {Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針后移Q->data[Q->rear] = x; // 新元素插入隊尾return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯} else {Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移*x = Q->data[Q->front]; // 獲取隊頭元素return true;}
}// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯} else {*x = Q->data[(Q->front + 1) % MaxSize]; // 獲取隊頭元素return true;}
}
在這個實現中,隊列滿的條件是隊尾指針后移一位后等于隊頭指針。這意味著隊列的實際容量是MaxSize
,因為所有的存儲單元都可以用來存儲元素?,與1a的相比主要改變了入隊和初始化的操作,入隊的時候,rear需要先往后一位,再接受新的數據。
1b(rear指向隊尾元素后一位,增加size變量記錄長度)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針int size;//增加一個size記錄隊列的長度
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {// 初始時隊頭、隊尾指針指向0Q->rear = Q->front = 0;Q->size = 0;
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue Q) {if (Q->size == 0) { // 判空條件return true;}else {return false;}bool QueueFull(SqQueue Q) {if (Q->size==MaxSize) { // 判滿條件return true;}else {return false;}
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(*Q)) { // 判斷隊滿return false; // 隊滿報錯}else {Q->data[Q->rear] = x; // 新元素插入隊尾Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針加1取模,隊尾指針后移Q->size = Q->size + 1; // 隊列長度加1return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(*Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移Q->size = Q->size - 1; // 隊列長度減1return true;}
}
// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {if (QueueEmpty(*Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q.data[Q.front];return true;}
}
2b(rear指向隊尾元素,增加size變量記錄長度)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針int size;//增加一個size記錄隊列的長度
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {// 初始時隊頭、隊尾指針指向Q->front = 0;Q->rear = MaxSize - 1;Q->size = 0;
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue Q) {if (Q->size == 0) { // 判空條件return true;}else {return false;}bool QueueFull(SqQueue Q) {if (Q->size==MaxSize) { // 判滿條件return true;}else {return false;}
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(*Q)) { // 判斷隊滿return false; // 隊滿報錯}else {Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針加1取模,隊尾指針后移Q->data[Q->rear] = x; // 新元素插入隊尾Q->size = Q->size + 1; // 隊列長度加1return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(*Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移Q->size = Q->size - 1; // 隊列長度減1return true;}
}
// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {if (QueueEmpty(*Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q.data[Q.front];return true;}
}
3a(rear指向隊尾元素后一位,判空判滿時添加一個tag標簽標記)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針int tag;//tag標簽用于標記,0=出隊,1=入隊
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {Q->front = Q->rear = 0; // 初始時隊頭、隊尾指針指向0Q->tag = 0;
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue* Q) {return (Q->front == Q->rear&&Q->tag==0); // 判空條件:隊頭指針等于隊尾指針
}// 判斷隊列是否已滿
bool QueueFull(SqQueue* Q) {return ((Q->rear + 1) % MaxSize == Q->front&&Q->tag==1); // 判滿條件:隊尾指針后移一位后等于隊頭指針
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判斷隊滿return false; // 隊滿報錯}else {Q->data[Q->rear] = x; // 新元素插入隊尾Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針后移Q->tag = 1;//入隊后tag變為1;return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯}else {Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移*x = Q->data[Q->front]; // 獲取隊頭元素Q->tag = 1;//出隊后tag變為1;return true;}
}// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q->data[Q->front]; // 獲取隊頭元素return true;}
}
3b(rear指向隊尾元素,判空判滿時添加一個tag標簽標記)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定義隊列中元素的最大個數typedef struct {int data[MaxSize]; // 用靜態數組存放隊列元素int front, rear; // 隊頭指針和隊尾指針int tag;//tag標簽用于標記,0=出隊,1=入隊
} SqQueue;// 初始化隊列
void InitQueue(SqQueue* Q) {Q->front = 0//初始時隊頭指針指向隊頭元素Q->rear = MaxSize-1;//初始時隊尾指針指向隊尾元素Q->tag = 0;
}// 判斷隊列是否為空
bool QueueEmpty(SqQueue* Q) {return (Q->front == Q->rear && Q->tag == 0); // 判空條件:隊頭指針等于隊尾指針
}// 判斷隊列是否已滿
bool QueueFull(SqQueue* Q) {return ((Q->rear + 1) % MaxSize == Q->front && Q->tag == 1); // 判滿條件:隊尾指針后移一位后等于隊頭指針
}// 入隊
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判斷隊滿return false; // 隊滿報錯}else {Q->rear = (Q->rear + 1) % MaxSize; // 隊尾指針后移Q->data[Q->rear] = x; // 新元素插入隊尾Q->tag = 1;//入隊后tag變為1;return true;}
}// 出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯}else {Q->front = (Q->front + 1) % MaxSize; // 隊頭指針后移*x = Q->data[Q->front]; // 獲取隊頭元素Q->tag = 1;//出隊后tag變為1;return true;}
}// 獲得隊頭元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判斷隊空return false; // 隊空則報錯}else {*x = Q->data[Q->front]; // 獲取隊頭元素return true;}
}