1、实现循环队列的各种基本运算,请将其中循环队列的基本运算实现。 并在主函数中测试算法的正确性。
队列的基本操作包括:1、初始化2、置空(清除内容)3、判空4、计数(队列的长度)5、取队列首元素的值6、入队7、出队8、遍历
#include <iostream>
#include <queue>
#include <string>
using namespace std;
template <typename T>
class LoopQueue
{
public:
LoopQueue(int c = 10);
~LoopQueue();
bool isEmpty(); //队列的判空
int size(); //队列的大小
bool push(T t); //入队列
bool pop(); //出队列
T front(); //队首元素
private:
int capacity;
int begin; //对头指针
int end; //对尾指针
T* queue;
};
template<typename T>
LoopQueue<T>::LoopQueue(int c = 10) //初始化队列
:capacity(c), begin(0), end(0), queue(nullptr)
{
queue = new T[capacity];
};
template<typename T>
LoopQueue<T>::~LoopQueue() //置空队列
{
delete[]queue;
}
template <typename T>
bool LoopQueue<T>::isEmpty() //判断循环队列是否为空
{
if (begin == end)
return true;
return false;
};
template<typename T>
int LoopQueue<T>::size()
{
return (end - begin + capacity) % capacity; //计算循环队列的长度
};
template<typename T>
bool LoopQueue<T>::push(T t)
{
if (end + 1 % capacity == begin) //判断队列是否已满
{
return false;
}
queue[end] = t;
end = (end + 1) % capacity;
return true;
};
template <typename T>
bool LoopQueue<T>::pop() //判断队列是否为空
{
if (end == begin)
{
return false;
}
begin = (begin + 1) % capacity;
return true;
};
template <typename T>
T LoopQueue<T>::front() //取对头元素
{
if (end == begin)
{
return false;
}
return queue[begin];
};
int main()
{
LoopQueue<string> queue(6); //入队
queue.push("one");
queue.push("two");
queue.push("three");
queue.push("four");
queue.push("five");
cout << "队列长度" << queue.size() << endl; //求队长}
while (!queue.isEmpty())
{
cout << queue.front() << endl;
queue.pop(); //出队列
}
getchar();
//system("pause");
return 0;
}
2、实现的链队列各种基本运算,请将其中链环队列的基本运算实现。 并在主函数中测试算法的正确性。
#include <iostream>
#include <cstdlib>
using namespace std;
struct QNode //定义队列结点的数据结构
{
QNode *next; //指针域,指向下一个结点
double data; //数据域,存储队列信息
};
struct LinkQueue //定义队列的数据结构
{
QNode *front; //队首指针,指向QNode类型的指针
QNode *rear; //队尾指针
};
void InitQueue(LinkQueue &Q) //构造一个空的队列
{
QNode *q;
q = new QNode; //申请一个结点的空间
q->next = NULL; //当作头结点
//队首与队尾指针都指向这个结点,指针域为NULL
Q.front = q;
Q.rear = q;
}
int IsEmpty(LinkQueue &Q) //判断队列是否为空
{
if (Q.rear == Q.front)
return 0;
else
return 1;
}
void EnQueue(LinkQueue &Q, double e) //从队列尾部插入元素
{
QNode *p; //新创建一个结点
p = new QNode;
p->next = NULL;
p->data = e; //输入数据信息
//将新结点插入队列尾部
Q.rear->next = p;
Q.rear = p; //设置新的尾结点
}
void DeQueue(LinkQueue &Q, double &e) //从队列首部删除一个结点
{
QNode *p;
p = Q.front->next;
e = p->data; //保存要出队列的数据
Q.front->next = p->next; //将下一个结点当作头结点后面链接的第一个结点
if (Q.rear == p) //如果要删除的元素即为尾结点,则将头指针赋予尾指针,一同指向头结点,表示队列为空
Q.rear = Q.front;
delete p;
}
void DestoryQueue(LinkQueue &Q) //销毁一个队列
{
while (Q.front)
{
Q.rear = Q.front; //从头节点开始,一个一个删除队列结点,释放空间
delete Q.front;
Q.front = Q.rear;
}
}
int main()
{
LinkQueue *Q; //定义一个队列Q
Q = new LinkQueue;
InitQueue(*Q);
cout << "开始往队列里输入数据,以-1作为结束符" << endl;
cout << "请输入一个数:" << endl;
double a, x;
cin >> a;
while (a != -1)
{
EnQueue(*Q, a);
cout << "请输入一个数:" << endl;
cin >> a;
}
//输出队列元素,队首->队尾
QNode *p;
p = Q->front->next;
if (p == NULL) //如果为空表,直接退出
{
cout << "队列为空!" << endl;
return 0;
}
cout << "队列数据依次为:" << endl;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
//删除队列元素
while (!IsEmpty(*Q))
{
DeQueue(*Q, x);
cout << x << " ";
}
//释放内存空间
delete Q->front;
delete Q;
system("pause");
return 0;
}