链式队列的构造(C++)

链式队列和数组队列有些不同,链式队列的队尾指针是指向最后一元素位置,而数组队列是指向最后一个元素的下一个位置。链式队列可以充分应用存储空间,不会存在浪费的情况。

template<class T>
struct LinkNode{
      T data;
      LinkNode<T> *link;
      LinkNode(T&x, LinkNode<T>*p=NULL):data(x),link(p){}
};

template<class T>
class LinkQueue{
public:
      LinkQueue():rear(NULL), Front(NULL){}
      ~LinkQueue(){makeEmpty();}
      bool EnQueue(const T&x);
      bool DeQueue(T&x);
      bool getFront(T&x)const;
      void makeEmpty();
      bool IsEmpty()const{return (Front==NULL)?true:false;}
      int getSize()const;
      friend ostream& operator<<(ostream& os, LinkQueue<T>& Q);
private:
      LinkNode<T> *Front, *rear;
};

template<class T>
void LinkQueue<T>::makeEmpty(){
      LinkNode<T> *p;
      while(Front!=NULL){
            p=Front;
            Front=Front->link;
            delete p;
      }
}

template<class T>
bool LinkQueue<T>::EnQueue(const T&x){
      //将新元素x插入到队列的队尾
      if(Front==NULL){//这里要考虑队列为空的情况,在这里要处理队尾和队头指针
            Front=rear=new LinkNode<T>(x);
            if(Front==NULL)return false;
      }
      else{//链式队列的队尾和数组式的不一样,数组式的是指向空位置,而链表式的指向末尾一个节点
            rear->link=new LinkNode<T>(x);
            if(rear->link==NULL)return false;
            rear=rear->link;
      }
      return true;
}

template<class T>
bool LinkQueue<T>::DeQueue(T&x){
      //如果队列不为空,将队头节点从链表中删除,若为空则直接退出
      if(IsEmpty())return false;
      LinkNode<T> *p;
      p=Front;
      x=p->data;
      Front=Front->link;
      delete p;
      return true;
}

template<class T>
bool LinkQueue<T>::getFront(T&x)const{
      if(IsEmpty())return false;
      x=Front->data;
      return true;
}

template<class T>
int LinkQueue<T>::getSize()const{
      LinkNode<T> *p=Front;
      int sum=0;
      while(p!=NULL){
            sum++;
            p=p->link;
      }
      return sum;
}

template<class T>
ostream& operator<<(ostream& os, LinkQueue<T>& Q){
      //输出队列中元素的重载操作<<
      os<<"队列中元素个数有"<<Q.getSize()<<endl;

      LinkQueue<T> *p=Q.Front;
      int i=0;
      while(p!=NULL){
            os<<"第"<<++i<<"个元素为"<<p.data<<endl;
            p=p->link;
      }
      return os;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值