实现顺序队列

队列(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章