双端队列 C++实现


题目要求

所谓双端队列(double-ended queue,deque),就是在列表的两端都可以插入和删除数据。因此它允许的操作有Create、IsEmpty、IsFull、Left、Right、AddLeft、AddRight、DeleteLeft、DeleteRight。使用循环数组方式实现双端队列,要求实现上述操作,并实现一个Print输出操作,能将队列由左至右的次序输出于一行,元素间用空格间隔。队列元素类型设为整型。

输入:input.txt,给出一个操作序列,可能是Create、Print之外的任何操作,需要的情况下,会给出参数。最后以关键字“End”结束,例如:
AddLeft 1
AddLeft 2
DeleteRight
IsFull
DeleteLeft
IsEmpty
AddRight 3
AddLeft 2
AddRight 1
End

输出:程序开始执行时,队列设置为空,按输入顺序执行操作,每个操作执行完后,将结果输出于一行。对于错误命令,输出“WRONG”。对IsEmpty和IsFull命令,试情况输出“Yes”或“No”。对Left和Right命令,若队列空,输出“EMPTY”,否则输出对应队列元素。对Add命令,若队列满,输出“FULL”,否则调用Print,输出队列所有元素。对Del命令,若队列空,输出“EMPTY”,否则输出所有元素。元素间用空格间隔,最后一个元素后不能有空格。最后输出一个回车。

例如,对上例,应输出:
―――――――――
1
2 1
2
No

Yes
3
2 3
2 3 1
――――――――

代码如下

#include<iostream>
#include<string>
#include<fstream>
using namespace std;

// 节点
template<class T>
class Node
{
public:
	T data;
	Node<T> *left;
	Node<T> *right;
	Node() {
		data= 0;
		left = right = nullptr;
	}
	Node(T n) {
		data= n;
		left = right = nullptr;
	}
};
// 双端队列
template<class T>
class double_ended_queue {
public:
	Node<T>*queue_left, *queue_right;
	int num;
	int size;
	
	double_ended_queue() {
		queue_left=queue_right = nullptr;
		num = 0;
		size = 10;
	}
	
	void IsEmpty();
	void IsFull();
	void AddLeft(T);
	void AddRight(T);
	void DeleteLeft();
	void DeleteRight();
	void Print();
};

template<class T>
void double_ended_queue<T>::IsEmpty() {
	num == 0 ? cout << "YES" << endl : cout << "NO" << endl;
}

template<class T>
void double_ended_queue<T>::IsFull() {
	num == size ? cout << "YES" << endl : cout << "NO" << endl;
}

template<class T>
void double_ended_queue<T>::Print() {
	if (num == 0)
	{
		cout << "EMPTY" << endl;
		return;
	}
	Node<T>*p = queue_left;
	for (int i = 0; i < num-1; i++) {
		cout << p->data << " ";
			p = p->right;
	}
	cout << p->data << endl;
}

template<class T>
void double_ended_queue<T>::AddLeft(T n) {
	Node<T>*p = new Node<T>(n);
	if (num == 0)
	{
		queue_left =queue_right=p;
		queue_left->left =queue_left->right=nullptr;
		num++;
	}
	else{
		if (num == size)
		{
			cout << "FULL  ";
			Print();
			return;
		}
		queue_left->left = p;
		p->right = queue_left;
		queue_left = queue_left->left;
		num++;
	}
	Print();
}

template<class T>
void double_ended_queue<T>::AddRight(T n) {
	Node<T>*p = new Node<T>(n);
	if (num == 0)
	{
		queue_left = queue_right = p;
		queue_right->left = queue_right->right = nullptr;
		num++;
	}
	else {
		if (num == size)
		{
			cout << "FULL  " ;
			Print();
			return;
		}
		queue_right->right = p;
		p->left = queue_right;
		queue_right = queue_right->right;
		num++;
	}
	Print();
}

template<class T>
void double_ended_queue<T>::DeleteLeft() {
	if (num == 0) {
		cout << "EMPTY" << endl;
		return;
	}
	Node<T>*p = queue_left->right;
	delete queue_left;
	queue_left = p;
	num--;
	Print();
}

template<class T>
void double_ended_queue<T>::DeleteRight() {
	if (num == 0) {
		cout << "EMPTY" << endl;
		return;
	}
	Node<T>*p = queue_right->left;
	delete queue_right;
	queue_right = p;
	num--;
	Print();
}

int main() {

	double_ended_queue<int> queue;
	// 输入文件
	ifstream infile("input.txt");
	//读取文件
	string s;
	getline(infile, s);
	while (s != "End") {
		if (s == "IsFull")
		{
			queue.IsFull();
			getline(infile, s);
			continue;
		}
		if (s == "IsEmpty")
		{
			queue.IsEmpty();
			getline(infile, s);
			continue;
		}
		if (s == "DeleteLeft")
		{
			queue.DeleteLeft();
			getline(infile, s);
			continue;
		}
		if (s == "DeleteRight")
		{
			queue.DeleteRight();
			getline(infile, s);
			continue;
		}
		if (s.substr(0, 7) == "AddLeft") {
			string a = s.substr(8, s.length());
			int n;
			n = atoi(a.c_str());
			/*string n = a;*/
			queue.AddLeft(n);
			getline(infile, s);
			continue;
		}
		string a = s.substr(9, s.length());
		int n;
		n = atoi(a.c_str());
	/*	string n = a;*/
		queue.AddRight(n);
		getline(infile, s);
		continue;
	}
	return 0;
}
发布了40 篇原创文章 · 获赞 57 · 访问量 2752

猜你喜欢

转载自blog.csdn.net/weixin_44984664/article/details/105130160