题目要求
所谓双端队列(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;
}