循环队列:
// cirQueue.h
/*
名称:循环队列 => 基于数组
*/
template<class DataType>
class CirQueue {
private:
const int QUEUE_SIZE; // 此处未给初始值,则必需在构造函数中初始化!
int front, rear;
DataType *queue;
public:
CirQueue(int q_size = 100) :QUEUE_SIZE(q_size + 1) { front = rear = 0; queue = new DataType[QUEUE_SIZE]; } // q_size + 1:多申请一个位置,保证队满、对空容易判定!
~CirQueue(){}
void enter(DataType data); // 入队操作
DataType shift(); // 出队操作
DataType getFront(); // 获得队头元素值
void show(); // 打印队列元素
bool isEmpty() { return front == rear ? true : false; } // 队空
bool isFull() { return (rear + 1) % QUEUE_SIZE == front ? true : false; } // 队满
int size() { return rear - front; } // 返回元素的个数。
};
template<class DataType>
void CirQueue<DataType>::enter(DataType data) {
if (isFull()) throw "Queue full !";
rear %= QUEUE_SIZE;
queue[rear++] = data; // int++: 是先用了再加一,所以不会存在越界的情况!
}
template<class DataType>
DataType CirQueue<DataType>::shift() {
if (isEmpty()) throw "Queue empty !";
return queue[(front++) % QUEUE_SIZE]; // 取出对头元素时,front位置是后移的。
}
template<class DataType>
DataType CirQueue<DataType>::getFront() {
if (isEmpty()) throw "Queue empty !";
return queue[front % QUEUE_SIZE]; //获取对头元素值时,front位置不变!
}
template<class DataType>
void CirQueue<DataType>::show() {
int cursor = front % QUEUE_SIZE;
while (cursor != rear)
{
cursor %= QUEUE_SIZE;
std::cout << queue[cursor++] << " ";
}
}
链队列:
// linkQueue.h
// 链队列 => 基于链表
template<class DataType>
struct QueueNode {
DataType data;
QueueNode<DataType>* next;
};
template<class DataType>
class LinkQueue {
private:
QueueNode<DataType>* front, * rear;
public:
LinkQueue();
~LinkQueue();
void enter(DataType data);
DataType shift();
DataType getFront();
void show();
bool isEmpty() { return front == rear ? true : false; }
int size();
};
template<class DataType>
LinkQueue<DataType>::LinkQueue() {
front = rear = new QueueNode<DataType>();
rear->next = NULL;
}
template<class DataType>
LinkQueue<DataType>::~LinkQueue() {
while (front != NULL)
{
QueueNode<DataType>* del_node = front;
front = front->next;
delete del_node;
}
}
template<class DataType>
void LinkQueue<DataType>::enter(DataType data) {
QueueNode<DataType>* node = new QueueNode<DataType>;
node->data = data;
node->next = NULL;
rear->next = node;
rear = node;
}
template<class DataType>
DataType LinkQueue<DataType>::shift() {
if (isEmpty())throw "queue empty !";
QueueNode<DataType>* del_node = front->next;
DataType front_value = del_node->data;
if (del_node->next != NULL) front->next = del_node->next;
else
{ // 删完就又变成了空链队列!此时将rear有指向front
front->next = NULL;
rear = front;
}
delete del_node;
return front_value;
}
template<class DataType>
DataType LinkQueue<DataType>::getFront() {
if (isEmpty())throw "queue empty !";
return front->next->data;
}
template<class DataType>
void LinkQueue<DataType>::show() {
if (isEmpty())throw "queue empty !";
QueueNode<DataType>* cursor = front;
do
{
cursor = cursor->next;
std::cout << cursor->data << " ";
} while (cursor != rear);
}
template<class DataType>
int LinkQueue<DataType>::size() {
int count = 0;
QueueNode<DataType>* cursor = front;
do
{
cursor = cursor->next;
count++;
} while (cursor != rear);
return count;
}
调用测试:
// queue.cpp
#include<iostream>
#include "cirQueue.h"
#include "linkQueue.h"
using namespace std;
int main() {
/*队列操作*/
cout << "循环队列:\n";
CirQueue<int> cir_queue(7);
for (int da : { 1, 2, 3, 4, 5, 6, 7 }) cir_queue.enter(da);
cout << "cir_queue:\n";
cir_queue.show();
cout << endl;
cout << "cir_queue size:" << cir_queue.size() << endl;
cout << "front param:" << cir_queue.shift()<< endl;
cout << "front param:" << cir_queue.getFront() << endl;
cout << "cir_queue size:" << cir_queue.size() << endl;
cout << "链队列:\n";
LinkQueue<int> link_queue;
for (int da = 1; da < 100; da++) link_queue.enter(da*da);
cout << "link_queue:\n";
link_queue.show();
cout << endl;
cout << "link_queue size:" << link_queue.size() << endl;
for (int i = 1; i < 10; i++) cout << "i=" << i << ", front param:" << link_queue.shift() << endl;
cout << "front param:" << link_queue.getFront() << endl;
cout << "link_queue size:" << link_queue.size() << endl;
}