實現順序隊列

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

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

實現順序隊列需要注意:
(1)採用順序存儲方式,需要預先分配空間,data[maxlen];
(2)採用循環結構克服“假溢出”問題,定義 rear + 1 = front爲隊列滿狀態;
(3)順序隊列的應用:輸出楊輝三角形。

以下爲實現順序隊列的代碼,在vs2010上測試通過:

#include <iostream>
using namespace std;
#define  maxlen 30

class myQueue
{
public:
    myQueue();
    bool empty();
    bool full();
    bool getFrontElement(int &x);//只能訪問隊列頭部的元素
    bool push(int x);//在隊列尾部插入元素
    bool pop();//刪除隊列頭部元素
    int size();

private:
    int front, rear;//頭部尾部索引值
    int count;//隊列中元素個數
    int data[maxlen];
};

int _tmain(int argc, _TCHAR* argv[])
{
    //運用隊列輸出楊輝三角形
    int n = 8;//設定楊輝三角形階數
    int s1 = 0, s2 = 0;
    myQueue que;
    que.push(1);//第一個元素入棧
    cout<<1<<endl;
    for(int i = 2; i <= n; i++)
    {
       s1 = 0;//前一個出棧的元素
        for(int j = 0; j < i - 1; j++)//對楊輝三角形中第i層,從左到右的元素依次入隊列
        {
            que.getFrontElement(s2);//取隊列頭元素
            que.pop();//列頭元素出棧
            cout<<s1 + s2<<" ";
            que.push(s1 + s2);
            s1 = s2;//前一個出棧的元素更新
        }
        que.push(1);//每行最後一個數值都爲1
        cout<<1<<endl;
    }
    return 0;
}

myQueue::myQueue()//初始化
{
    front = rear = 0;
    count = 0;
}

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

//教材中對滿隊列的一種定義
//留出一個元素空間不使用(與棧區分),頭,尾索引相差1時,定義爲滿隊列
bool myQueue::full()
{
    if(count == maxlen - 1)
        return true;
    else
        return false;
}

bool myQueue::getFrontElement(int &x)
{
    if(empty())
        return false;
    else
    {
        //隊列頭索引值所在空間沒有存儲元素
        //訪問隊列頭元素時,front不能變化
        //front = (front + 1) % maxlen; //error
        x = data[(front + 1) % maxlen];
        return true;
    }
}

bool myQueue::push(int x)
{
    if(full())
        return false;
    else
    {
        rear = (rear + 1) % maxlen;
        data[rear] = x;
        count++;
        return true;
    }
}

bool myQueue::pop()
{
    if(empty())
        return false;
    else
    {
        front = (front + 1) % maxlen;//取模運算,與循環隊列相符合
        count--;
        return true;
    }
}

int myQueue::size()
{
    return count;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章