1.循环队列
C++实现:
Queue.h
#pragma once
#ifndef QUEUE_H
#define QUEUE_H
template <typename T>
class Queue
{
public:
//Queue数据类型表
typedef T Value_Type;
typedef T& Value_Reference;
typedef T* Value_Pointer;
typedef const T& Const_Value_Reference;
typedef const Queue& Const_Queue_Reference;
private:
//重载赋值运算符
void operator=(Const_Queue_Reference) {}
//拷贝构造函数
Queue(Const_Queue_Reference) {}
public:
//默认构造函数
Queue() {}
//析构函数
virtual ~Queue() {}
//清空栈
virtual void clear() = 0;
//入队
virtual void enter_Queue(Const_Value_Reference) = 0;
//出栈
virtual Value_Type out_Queue() = 0;
//返回栈的头部的值
virtual Const_Value_Reference front_Value() = 0;
//栈的长度
virtual int length()const = 0;
};
Array_Queue.h
#pragma once
#include "Queue.h"
#include <iostream>
#include <string>
#define DEFAULT_SIZE 100
template <typename T>
class Array_Queue :public Queue<T>
{
public:
//Array_Queue数据类型表
typedef T Value_Type;
typedef T& Value_Reference;
typedef T* Value_Pointer;
typedef const T& Const_Value_Reference;
typedef const Array_Queue& Const_Array_Queue_Reference;
private:
int array_Size; //创建栈时申请的内存空间大小
int front; //指向队头元素的指针
int rear; //指向队尾元素的指针
Value_Type* list_Array; //实现栈的数组
//满足某种异常条件,抛出异常,打印错误信息
void judge_OutOfRange(bool condition, const std::string& printInfo)
{
try
{
if (condition)
{
throw condition;
}
}
catch (bool)
{
std::cerr << printInfo << std::endl;
exit(1);
}
}
public:
//默认构造函数
Array_Queue(int size = DEFAULT_SIZE)
{
array_Size = size+1;
rear = 0;
front = 1;
list_Array = new Value_Type[array_Size];
}
//析构函数
~Array_Queue()
{
delete[] list_Array;
}
//清空队列
void clear() override
{
rear = 0;
front = 1;
}
//入队
void enter_Queue(Const_Value_Reference value) override
{
judge_OutOfRange((rear+2)%array_Size==front, "Array Queue is full!");
rear = (rear + 1) % array_Size;
list_Array[rear]=value;
}
//出队
Value_Type out_Queue() override
{
judge_OutOfRange(length()==0, "Array Queue is empty!");
Value_Type return_Value = list_Array[front];
front = (front + 1) % array_Size;
return return_Value;
}
//返回队首元素的值
Const_Value_Reference front_Value() override
{
judge_OutOfRange(length() == 0, "Array Queue is empty!");
return list_Array[front];
}
//队的长度
int length()const override
{
int return_length = (array_Size + (rear - front) + 1) % array_Size;
//解释:
// 1.rear与front的关系可能是
// (1)front在数组下标大的一端,rear在小的一端:rear-front就会为负,
// 当加上array_Size取余就变成了数组中除去rear到front之间的元素的剩余元素的长度了,
// (2)front在数组下标大的一端,rear在小的一端:rear-front就会为正
// 当加上array_Size取余还是rear之间front的长度
// 2.加1是因为两数相减的长度中不包含一端本身的值,比如5-3=2,但是5,4,3有三个值
// 即rear-front的长度不算front本身,所以加1
return return_length;
}
void print()
{
int i = front;
while (i != rear + 1)
{
std::cout << list_Array[i] << std::endl;
i = (i + 1) % array_Size;
}
}
};
main.cpp
#include <iostream>
#include "Array_Queue.h"
using namespace std;
int main()
{
Array_Queue<int> test_queue;
cout << "测试enter_Queue" << endl;
test_queue.enter_Queue(10);
test_queue.enter_Queue(20);
test_queue.enter_Queue(20);
test_queue.enter_Queue(30);
test_queue.enter_Queue(40);
cout << "出队前遍历:" << endl;
test_queue.print();
cout << "出队前队列长度" << endl;
cout << test_queue.length() << endl;
cout << "测试out_Queue" << endl;
cout << test_queue.out_Queue() << endl;
cout << "出队后遍历:" << endl;
test_queue.print();
cout << "出队后队列长度" << endl;
cout << test_queue.length() << endl;
cout << "测试front_Value" << endl;
cout << test_queue.front_Value() << endl;
cout << "测试clear" << endl;
test_queue.clear();
cout << test_queue.length() << endl;
}
2.链式队列
C++实现:
Queue.h
同上
Link_Queue.h
#pragma once
#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H
#include "Single_Link_List_Node.h"
#include "Queue.h"
#include<iostream>
#include<string>
//带头结点的链表:出队是在操作front->next
template<typename T>
class Link_Queue:public Queue<T>
{
public:
typedef T Value_Type;
typedef T& Value_Type_Reference;
typedef const T& Const_Value_Type_Reference;
typedef Single_Link_List_Node<T> Node;
typedef Single_Link_List_Node<T>* Front;
typedef Single_Link_List_Node<T>* Rear;
private:
Front front;
Rear rear;
int size;
//满足某种异常条件,抛出异常,打印错误信息
void judge_OutOfRange(bool condition, const std::string& printInfo)
{
try
{
if (condition)
{
throw condition;
}
}
catch (bool)
{
std::cerr << printInfo << std::endl;
exit(1);
}
}
public:
//构造函数
Link_Queue()
{
front = rear = new Node;
size = 0;
}
//析构函数
~Link_Queue()
{
clear();
delete front;
}
//清空队列
void clear() override
{
while (front->next != nullptr)
{
Node* temp = front->next;
front->next = temp->next;
delete temp;
}
rear = front;
size = 0;
}
//入队
void enter_Queue(Const_Value_Type_Reference value) override
{
rear->next = new Node; //新建结点分配内存
::new(rear->next)Node(value,nullptr); //调用构造函数
rear = rear->next;
size++;
}
//出队
Value_Type out_Queue() override
{
judge_OutOfRange(length() == 0,"Queue is empty!");
Value_Type return_value = front->next->value;
Node* temp = front->next;
front->next= front->next->next;
if (rear == temp)
rear = front;
delete temp;
size--;
return return_value;
}
//返回队首元素的值
Const_Value_Type_Reference front_Value() override
{
judge_OutOfRange(length() == 0, "Array Queue is empty!");
return front->next->value;
}
//队的长度
int length()const override
{
return size;
}
//遍历打印队列中值
void print()
{
Node* temp = front->next;
while (temp!=nullptr)
{
std::cout << temp->value << std::endl;
temp = temp->next;
}
}
};
#endif // !LINK_QUEUE_H
main.cpp
#include <iostream>
#include "Link_Queue.h"
using namespace std;
int main()
{
Link_Queue<int> test_queue;
cout << "测试enter_Queue" << endl;
test_queue.enter_Queue(10);
test_queue.enter_Queue(20);
test_queue.enter_Queue(20);
test_queue.enter_Queue(30);
test_queue.enter_Queue(40);
cout << "出队前遍历:" << endl;
test_queue.print();
cout << "出队前队列长度" << endl;
cout << test_queue.length() << endl;
cout << "测试out_Queue" << endl;
cout << test_queue.out_Queue() << endl;
cout << "出队后遍历:" << endl;
test_queue.print();
cout << "出队后队列长度" << endl;
cout << test_queue.length() << endl;
cout << "测试front_Value" << endl;
cout << test_queue.front_Value() << endl;
cout << "测试clear" << endl;
test_queue.clear();
cout << test_queue.length() << endl;
}
3.双端队列