#include <iostream>
using namespace std;
template<typename T, int size = 0>
class Queue
{
public:
Queue();
bool isEmpty() const;
bool isFull()const;
void enQueue(const T&);
T deQueue();
void traverse()const;
private:
T storge[size];
int first;
int last;
};
template<typename T, int size>
Queue<T, size>::Queue()
{
first = last = -1;
}
template<typename T, int size>
bool Queue<T, size>::isEmpty()const
{
//如果為空,first必然為-1,因為在deQueue()出棧函數中已經處理
return first == -1;
}
template<typename T, int size>
bool Queue<T, size>::isFull()const
{
//兩種情況,第一種是正常的滿,第二種是存在出隊時的滿
return first == 0 && last == size - 1 || last == first - 1;
}
template<typename T, int size>
void Queue<T, size>::enQueue(const T& elem)
{
if (!isFull())
{
//last為-1或指向最后一個元素的位置時
if (last == -1 || last == size - 1)
{
storge[0] = elem;
last = 0;
//若隊列為空,還需將first賦為0
if (first == -1)
{
first = 0;
}
}
else
{
storge[++last] = elem;
}
}
else
{
cout << "Queue full." << endl;
exit(1);
}
}
template<typename T, int size>
T Queue<T, size>::deQueue()
{
if (isEmpty())
{
cout << "Queue empty." << endl;
exit(1);
}
T temp;
temp = storge[first];
//隊列中只有一個元素時
if (first == last)
{
//這樣,判斷是否為空時只需判定first是否為-1
first = last = -1;
}
else if (first == size - 1)
{
//回到第一個元素位置
first = 0;
}
else
{
++first;
}
return temp;
}
template<typename T, int size>
void Queue<T, size>::traverse()const
{
for (auto i = first; i <= last; ++i)
{
cout << storge[i] << " ";
}
cout << endl;
}
int main()
{
Queue<int, 3> queue;
queue.enQueue(10);
queue.enQueue(10);
queue.enQueue(10);
cout << queue.isFull() << endl;
queue.traverse();
queue.deQueue();
queue.traverse();
queue.deQueue();
cout << queue.isEmpty() << endl;
queue.deQueue();
cout << queue.isEmpty() << endl;
system("pause");
return 0;
}
運行測試: