1.隊列的特點: 先進先出,用數組存儲。
***2.隊列的基本操作:***存入數據、刪除數據、讀隊列頭數據。
需要一個變量front指向隊列的頭下標,另一個變量rear指向隊列的尾下標。
增加元素時rear向後移一個,刪除一個元素時front向後移一個,但是並不
刪除原有數據,這樣的話就會浪費前面的空間,所以我們要假設數組前後相
連,循環的存放數據,直到數組中所有數據都有效時存滿。
存入數據(append):
刪除數據(serve):
讀取隊列頭數據(retrieve):
3.程序實現
#include<iostream>
#include"utility.h"
using namespace std;
const int maxqueue = 10; //隊列的長度,也就是數組的長度
class Queue {
public:
Queue(); //構造函數
bool empty() const; //判斷隊列是否爲空,在函數操作中並不改變隊列元素,所以要加const
Error_code serve(); //刪除一個數據
Error_code append(const Queue_entry &item); //將item的值加進隊列中,爲了節省空間用引用,但使用過程中不能改變原有值,所以加const
Error_code retrieve(Queue_entry &item) const; //讀出隊列的頭數據,在函數操作中並不改變隊列元素,所以要加const
protected:
int count; //計算隊列數據個數
int front, rear; //隊列頭下標和隊列尾下標
Queue_entry entry[maxqueue]; //定義一個數組當做隊列來存放數據
};
Queue::Queue() //構造函數
/*
Post: The Queue is initialized to be empty.
*/
{
count = 0; //初始隊列個數爲0
rear = maxqueue - 1; //存入數據時rear先向後移再放數據,所以初始時rear應該指向0號下標的前一個,隊列是循環的,所以rear爲總長度減一
front = 0; //初始時front指向0號下標
}
bool Queue::empty() const //判斷隊列是否爲空
{
return count == 0;
}
Error_code Queue::append(const Queue_entry &item) //將item的值加進隊列中
{
if (count >= maxqueue) return overflow; //若隊列中已存滿則提示溢出,未滿則執行下一步
count++;
rear = ((rear + 1) == maxqueue) ? 0 : (rear + 1); //若rear現在已經指向數組的最大下標則循環,這個數據存放在0下標
entry[rear] = item; //將數據存入數組
return success;
}
Error_code Queue::serve() //刪除一個數據
{
if (count <= 0) return underflow; //若隊列中無元素則提示下溢出
count--;
front = ((front + 1) == maxqueue) ? 0 : (front + 1); //若目前front指向最大下標,則刪除這個元素,front需向後移,循環則指向0號下標
return success;
}
Error_code Queue::retrieve(Queue_entry &item) const //讀出隊列的頭數據
{
if (count <= 0) return underflow; //若隊列中無元素則提示下溢出
item = entry[front]; //將隊列頭元素的值賦給item
return success;
}