目錄
一、隊列的順序實現
#define MaxSize 10 //定義隊列中元素的最大個數
typedef struct{
ElemType data[MaxSize]; //用靜態數組存放隊列元素
int front,rear; //隊頭指針和隊尾指針
}SqQueue;
void testQueue(){
SqQueue Q; //聲明一個隊列(順序存儲)
}
內存狀態
二、初始化操作
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &Q){
//初始時 隊頭、隊尾指針指向0
Q.rear = Q.front;
}
void testQueue(){
SqQueue Q;
InitQueue(Q);
}
//判斷隊列是否爲空
bool QueueEmpty(SqQueue Q){
if(Q.rear == Q.front)
return true;
else
return false;
}
內存狀態
三、入隊操作
bool EnQueue(SqQueue &Q,ElemType x){
if(隊列已滿)
return false; //隊滿則報錯
Q.data[Q.rear] = x; //新元素插入隊尾
Q.rear = (Q.rear + 1) % MaxSize; //隊尾指針加1取模
return true;
}
四、循環隊列
用模運算將存儲空間在邏輯上變成了環狀
Q.data[Q.rear] = x; //新元素插入隊尾
Q.rear = (Q.rear + 1) % MaxSize; //隊尾指針加1取模
判斷已滿的條件:隊尾指針的再下一個位置是隊頭,即(Q.rear + 1)%MaxSize == Q.front
1.入隊操作
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear + 1)%MaxSize == Q.front) //判斷隊滿
return false;
Q.data[Q.rear] = x; //新元素插入隊尾
Q.rear = (Q.rear + 1)%MaxSize; //隊尾指針加1取模
return true;
}
2.出隊操作
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear == Q.front)
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1)%MaxSize; //隊頭指針後移
return true;
}
bool GetHead(SqQueue Q,ElemType &x){
if(Q.rear == Q.front)
return false;
x = Q.data[Q.front];
return true;
}
3.判斷隊列已滿/已空
方案一:
//定義
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
隊列元素個數:(rear + MaxSize - front) % MaxSize
方案二:
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
int size; //隊列當前長度
}SqQueue;
初始化時:rear = front = 0; size = 0;
當插入成功時:size++;
當刪除成功時:size--;
這樣就能避免當rear = front時,造成長度爲0的現象
方案三:
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
int tag; //最近進行的是刪除/插入
}SqQueue;
初始化時:rear = front = 0;tag = 0;
每次刪除操作成功時,都令tag = 0;
每次插入操作成功時,都令tag = 1;
隊滿條件:front == rear && tag == 1;
隊空條件:front == rear && tag == 0;
4.其他出題方法
入隊操作:
Q.rear = (Q.rear + 1)%MaxSize;
Q.data[Q.rear] = x;
判空:
(Q.rear + 1)%MaxSize == Q.front
五、總結
思考:
分別採用
①a、①b、①c
②a、②b、②c
策略時,這些操作怎麼實現