队列的定义以及实现

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

/*
数据结构:Queue (数组实现)    ----引申  ①队列  ②双端队列  ③循环队列  ④优先队列  目标实现循环双端队列
功能:
      clear     //清除队列
      empty     //判断队列是否为空
      size      //返回队列中实际数据个数
      max_size  //返回容器中最大数据量
      resize    //重新指定容器大小

      push_front //开头插入元素
      push_back  //尾部插入元素
      pop_front  //头部删除元素
      pop_back   //尾部删除元素
      show       //显示队列所有元素

/*********附加功能(未实现)**********//*
      Iterator
      assign
      emplace
      swap

*/
#include<iostream>
#include<deque>
#include<string>

template <typename T>
class Queue{
private:
    int Front,Rear;                             //队首和队尾
    T *data;                                    //队列的值
    std::string::size_type Size;                //队列大小
public:
Queue()
{
    Size =20;
    Front=0;
    Rear=0;
    data = new T[Size];
}

~Queue()
{
   delete[] data;
}

void clear()
{
  Front=0;
  Rear=0;
  Size=0;
}

bool empty()const
{
    return (Front==Rear);
}

std::string::size_type size()
{
  return (Rear-Front+Size)%Size;
}

std::string::size_type max_size()
{
    return Size;
}

void resize(std::string::size_type RE)
{
    Size=RE;
    T* temp = data;
    data = new T[RE];
    for(auto i = 0,j=Front;i<Size||j<Rear;i++,j++)
        data[i] = temp[j];
    Rear = Size>Rear?size():Size;
    Front = 0;
    delete[]temp;
}

void push_front(const T& val)
{
  if(size()!=Size)
  {
      data[Front] = val;
      Front = (Front-1+Size)%Size;
  }
  else
    std::cout<<"上溢"<<std::endl;

}

void push_back(const T& val)
{
 if(size()!=Size)
  {
      data[Rear] = val;
      Rear = (Rear+1)%Size;
  }
  else
  std::cout<<"上溢"<<std::endl;
}

void pop_front()
{
  if(!empty())
  {
    Front = (Front+1)%Size;
  }
  else
  {
      std::cout<<"下溢"<<std::endl;
  }
}

void pop_back()
{
   if(!empty())
  {
    Rear = (Rear-1+Size)%Size;
  }
  else
  {
      std::cout<<"下溢"<<std::endl;
  }
}


T& top_front()
{
  if(!empty()) return data[Front];
}

T& top_back()
{
   if(!empty()) return data[Rear];
}

void show()
{
    for(int i = Front;i<Rear;i++)
    {
      std::cout<<data[i]<<" ";
    }
    std::cout<<std::endl;
}

/*
void info()
{
    std::cout<<"目前类内情况"<<std::endl;
    std::cout<<"Front:"<<Front<<"  Rear"<<Rear<<"  Size"<<Size<<std::endl;
}
*/

};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值