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