數據結構筆記——隊列的順序存儲

目錄

一、隊列的順序實現

二、初始化操作

三、入隊操作

四、循環隊列

五、總結

一、隊列的順序實現

#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

策略時,這些操作怎麼實現

 

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