队列的实践训练

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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥的C++养成之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值