實現鏈式隊列

隊列(queue)在計算機科學中,是一種先進先出的線性表。它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。

隊列可以採用順序存儲方式來實現(稱爲順序隊列),或者採用鏈式存儲方式來實現(稱爲鏈式隊列)。

實現鏈式隊列需要注意:
(1)採用動態鏈表作爲存儲結構;
(2)不需要預分配空間,比順序隊列更靈活;
(3)沒有鏈式隊列滿狀態這種說法,因爲沒有定義最大內存空間;
(4)與順序隊列相似,有空出一個結點沒有使用;
(5)當刪除最後一個結點時,需要做調整:rear = front; 避免rear指針指向一個已經刪除的結點;

以下爲實現代碼,在vs2010上測試通過:

#include <iostream>
using namespace std;

struct node
{
    int data;
    node* next;
};

class queue
{
public:
    queue();
    ~queue();
    bool empty();
    //bool full();//鏈式沒有滿的情況
    bool getTopElement(int &x);
    bool push(int x);
    bool pop();
    int size();

private:
    int count;
    node* front, *rear;
};

int _tmain(int argc, _TCHAR* argv[])
{
    queue que;
    for(int i = 0; i < 5; i++)
        que.push(i);

    int x;
    while(!que.empty())//驗證是否滿足“先進後出原則”
    {
        que.getTopElement(x);
        que.pop();
    }

    return 0;
}

queue::queue()
{
    count = 0;
    front = new node;
    rear = front;
    front->next = NULL;//空出一個結點沒有使用
}

bool queue::empty()
{
    if (count == 0)
        return true;
    else
        return false;
}

bool queue::getTopElement(int &x)//訪問隊列頭元素
{
    if(empty())
        return UNDERFLOW;
    else
    {
        x = front->next->data;//中間隔了一個空結點
        return true;
    }
}

//隊列在尾部添加元素,堆棧在頂部添加元素
bool queue::push(int x)//彈出隊列頭元素
{
    node* s = new node;
    s->data = x;
    s->next = NULL;
    rear->next = s;
    rear = s;
    count ++;
    return true;
}

bool queue::pop()//彈出隊列頭元素
{
    if(empty())
        return OVERFLOW;
    else
    {
        node* u = front->next;
        front->next = u->next;
        delete u;
        count--;
        if(front->next == NULL)//當刪除最後一個元素時,需要調整
            rear = front;//避免rear指針指向一個已經刪除的結點
        return true;
    }
}

int queue::size()
{
    return count;
}

queue::~queue()
{
    while(!empty())
        pop();
    delete front;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章