隊列的操作與實現——循環隊列

由於順序隊列有“假溢出”的缺點,所以在應用中,運用更多的是循環隊列來實現隊列的順序存儲
(由於引用傳參數,所以源文件需要.cpp後綴,即c++文件存儲。)
循環隊列的判空條件爲:Q.rear == Q.fornt;
循環隊列的判讀隊滿的條件是:(Q.rear + 1) % MaxSize == Q.fornt;
下面是隊列實現的存儲類型結構體:

#define MaxSize 50
typedef int ElemType;

typedef struct {
    ElemType data[MaxSize];
    int fornt, rear;
}SqQueue;

下面是對隊列的一些基本操作:

void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool EnQueue(SqQueue &Q, ElemType e);    //進隊
bool DeQueue(SqQueue &Q, ElemType &e);      //出隊
bool GetHead(SqQueue Q, ElemType &e);       //獲取頭元素

下面是一個測試主方法:

int main()
{
    int s;
    SqQueue sQueue;
    InitQueue(sQueue);

    scanf("%d", &s);    //循環入隊列
    while(s != 9999)
    {
        EnQueue(sQueue, s);
        scanf("%d", &s);
    }

    GetHead(sQueue, s);
    printf("隊頭元素爲:%d \n", s);

    printf("隊所有元素爲:");
    while(sQueue.rear != sQueue.fornt)
    {
        DeQueue(sQueue, s);
        printf("%d ", s);
    }

    return 0;
}

運行結果如下:
隊列的運行結果圖
完整的源程序如下:

#include "stdio.h"
#include "stdlib.h"

#define MaxSize 50
typedef int ElemType;

typedef struct {
    ElemType data[MaxSize];
    int fornt, rear;
}SqQueue;

void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool EnQueue(SqQueue &Q, ElemType e);    //進隊
bool DeQueue(SqQueue &Q, ElemType &e);      //出隊
bool GetHead(SqQueue Q, ElemType &e);       //獲取頭元素

int main()
{
    int s;
    SqQueue sQueue;
    InitQueue(sQueue);

    scanf("%d", &s);    //循環入隊列
    while(s != 9999)
    {
        EnQueue(sQueue, s);
        scanf("%d", &s);
    }

    GetHead(sQueue, s);
    printf("隊頭元素爲:%d \n", s);

    printf("隊所有元素爲:");
    while(sQueue.rear != sQueue.fornt)
    {
        DeQueue(sQueue, s);
        printf("%d ", s);
    }

    return 0;
}

void InitQueue(SqQueue &Q)
{
    Q.rear = Q.fornt = 0;
}

bool isEmpty(SqQueue &Q)
{
    if(Q.fornt == Q.rear)   //此處爲循環隊列判空條件
        return true;
    else
        return false;
}

bool EnQueue(SqQueue &Q, ElemType e)
{
    if((Q.rear + 1) % MaxSize == Q.fornt)
        return false;
    Q.data[Q.rear] = e;     //先賦值
    Q.rear = (Q.rear + 1) % MaxSize;  //再移動指針
    return true;
}

bool DeQueue(SqQueue &Q, ElemType &e)
{
    if(Q.fornt == Q.rear)
        return false;   //隊空情況
    e = Q.data[Q.fornt];
    Q.fornt = (Q.fornt + 1) % MaxSize;
    return true;

}

bool GetHead(SqQueue Q, ElemType &e)
{
    if(Q.fornt == Q.rear)
        return false;   //隊空情況
    e = Q.data[Q.fornt];
    return true;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章