线性表(5)——队列——循环队列、链式队列、双端队列

本文详细介绍了如何使用C++实现三种队列结构:循环队列,包括Queue.h、Array_Queue.h和main.cpp的实现;链式队列,基于Queue.h,同时提供了Link_Queue.h和main.cpp的代码;以及双端队列的概念。
摘要由CSDN通过智能技术生成

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.双端队列

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值