循环队列在顺序队列的基础上解决了假象溢出的问题,其他操作并没有太大改变。
关于假象溢出
由于采用的是顺序储存结构,这里的循环并不是真正意义上的收尾相连,而是通过对rear和front指针的移动取余的方法来实现
rear = (rear + 1) % queuesize;//queuesize是队列长度
具体代码如下
头文件
#include<iostream>
using namespace std;
const int queuesize = 10;
template<typename T>
class Queue {
private :
T data[queuesize];
int front, rear;
public:
Queue() { front = 0; rear = 0; memset(data, 0, sizeof(data)); }
~Queue(){}
void EnQueue(T x);
T DeQueue();
T GetFront();
bool isEmpty();
void Print();
};
template<typename T>
void Queue<typename T>::EnQueue(T x) {
if ((rear + 1) % queuesize != front)//通过取余的方法判断队列是否已满或更新rear
{
rear = (rear + 1) % queuesize;
data[rear] = x;
}
else
{
cout << "队满";
}
}
template<typename T>
T Queue<typename T>::DeQueue() {
if (rear == front)
{
cout << "队空";
}
else
{
front = (front + 1) % queuesize;
}
return data[front];
}
template<typename T>
T Queue<typename T>::GetFront() {
int i = 0;
i = (front + 1) % queuesize;
return data[i];
}
template<typename T>
bool Queue<typename T>::isEmpty(){
if (rear == front)
return true;
else
return false;
}
template <typename T>
void Queue<typename T>::Print() {
while (!isEmpty())
{
cout<< DeQueue() << '\t';
}
cout << endl;
}
源文件
#include"Queue.h"
#include<string>
int main()
{
Queue<int> a;
for (int i = 1; i < 10; i++) {
a.EnQueue(i*10);
}
a.Print();
cout<<a.isEmpty()<<endl;
Queue<string>b;
cout << "请输入:"<<endl;
for (int i = 1; i < 10; i++) {
string c; cin >> c;
b.EnQueue(c);
}
b.Print();
cout << b.isEmpty()<<endl;
return 0;
}