隊列(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;
}