用c++实现队列

1.队列的特点: 先进先出,用数组存储。
***2.队列的基本操作:***存入数据、删除数据、读队列头数据。

   需要一个变量front指向队列的头下标,另一个变量rear指向队列的尾下标。
   增加元素时rear向后移一个,删除一个元素时front向后移一个,但是并不
   删除原有数据,这样的话就会浪费前面的空间,所以我们要假设数组前后相
   连,循环的存放数据,直到数组中所有数据都有效时存满。

存入数据(append):
在这里插入图片描述
删除数据(serve):
在这里插入图片描述
读取队列头数据(retrieve)
在这里插入图片描述
3.程序实现

#include<iostream>
#include"utility.h"

using namespace std;

const int maxqueue = 10; //队列的长度,也就是数组的长度

class Queue {
public:
   Queue();  //构造函数
   bool empty() const;  //判断队列是否为空,在函数操作中并不改变队列元素,所以要加const
   Error_code serve();  //删除一个数据
   Error_code append(const Queue_entry &item);  //将item的值加进队列中,为了节省空间用引用,但使用过程中不能改变原有值,所以加const
   Error_code retrieve(Queue_entry &item) const;  //读出队列的头数据,在函数操作中并不改变队列元素,所以要加const

protected:
   int count;  //计算队列数据个数
   int front, rear;  //队列头下标和队列尾下标
   Queue_entry entry[maxqueue];  //定义一个数组当做队列来存放数据
};


Queue::Queue() //构造函数
/*
Post: The Queue is initialized to be empty.
*/
{
   count = 0; //初始队列个数为0
   rear = maxqueue - 1;  //存入数据时rear先向后移再放数据,所以初始时rear应该指向0号下标的前一个,队列是循环的,所以rear为总长度减一
   front = 0; //初始时front指向0号下标
}

bool Queue::empty() const //判断队列是否为空
{
   return count == 0;
}

Error_code Queue::append(const Queue_entry &item)  //将item的值加进队列中
{
   if (count >= maxqueue) return overflow;  //若队列中已存满则提示溢出,未满则执行下一步
   count++;
   rear = ((rear + 1) == maxqueue) ? 0 : (rear + 1);  //若rear现在已经指向数组的最大下标则循环,这个数据存放在0下标
   entry[rear] = item;  //将数据存入数组
   return success;
}


Error_code Queue::serve()   //删除一个数据
{
   if (count <= 0) return underflow; //若队列中无元素则提示下溢出
   count--;
   front = ((front + 1) == maxqueue) ? 0 : (front + 1); //若目前front指向最大下标,则删除这个元素,front需向后移,循环则指向0号下标
   return success;
}


Error_code Queue::retrieve(Queue_entry &item) const   //读出队列的头数据
{
   if (count <= 0) return underflow;  //若队列中无元素则提示下溢出
   item = entry[front];  //将队列头元素的值赋给item
   return success;
}


4.扩展功能

class Extended_queue: public Queue
{
public:
   bool full() const;  //判断队列是否存满
   int size() const;   //查询队列中元素个数
   void clear();       //清空队列数据
   Error_code serve_and_retrieve(Queue_entry &item); //读出队列第一个元素并且删除
};

bool Extended_queue::full() const
{
    return maxqueue == count;  //判断队列数据个数是否与最大个数相等,相等则表示已满
}

int Extended_queue::size() const
{
    return count;
}

void Extended_queue::clear()
{
    count = 0;
    rear = maxqueue - 1;
    front = 0;
}

Eorror_code Extended_queue::serve_and_retrieve(Queue_entry &item)
{
    retrieve(item);
    serve();
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

格格不入ち

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

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

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

打赏作者

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

抵扣说明:

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

余额充值