队列-单链表

本文探讨了使用单链表实现队列数据结构的方法,详细介绍了插入、弹出、判断队列是否为空及获取队列大小等核心操作的实现过程,并提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一篇学习笔记。

单链表实现队列:

  • 插入:新元素插入队列尾部
  • 弹出:从队列头部弹出(如果头部插入,尾部弹出,有什么区别?弹出时,从头遍历到尾部再弹出,效率低。增加一个指针指向尾部前一个节点可以提高效率,但增删的代码会复杂点,毕竟操作三个指针。另外,循环指针也可解决这个问题。)
  • 判断空否:return (front==rear&&front==NULL)?true:false;
  • 判断满否:只要计算机内存足够,单链表理论上可以不断增加,因此不需判断。

代码: 

//  Created by scnulpc on 2018/10/12.
//  Copyright © 2018年 scnulpc. All rights reserved.
//

#include <iostream>
using namespace std;
template <class T>
struct linkNode
{
    T value;
    linkNode<T>* link;
    linkNode(T x):value(x),link(NULL){};
};
template <class T>
class LinkQueue
{
public:
    linkNode<T>* p;         //附带头结点
    linkNode<T>* front;     //队列头结点
    linkNode<T>* rear;      //队列尾节点
    
public:
    LinkQueue():p(new linkNode<T>(0)),front(NULL),rear(NULL){}
    ~LinkQueue();
    bool isEmpty()const{return front==NULL?true:false;}  //判断队列空否
    bool push(T& x);
    bool pop(T& x);
    bool getFront(T& x)const;
    void makeEmpty();
    int getSize()const;
    friend ostream& operator<<(ostream& out,LinkQueue<T>& s);
};
template <class T>
LinkQueue<T>::~LinkQueue()
{
    makeEmpty();
    delete p;
}
template <class T>
bool LinkQueue<T>::push(T &x)   //尾插入法
{
    if (isEmpty())
    {
        front=rear=new linkNode<T>(x);
        p->link=front;
    }
    else
    {
        rear->link = new linkNode<T>(x);
        rear=rear->link;
    }
    return true;
}
template <class T>
bool LinkQueue<T>::pop(T &x)  //队列头弹出
{
    if (isEmpty()) return false;
    if (front==rear) rear=NULL;
    linkNode<T>* temp=front;
    x=front->value;
    front=front->link;
    p->link=front;
    delete temp;
    return true;
}
template <class T>
bool LinkQueue<T>::getFront(T &x)const
{
    if (isEmpty()) return false;
    x=front->value;
    return true;
}
template <class T>
void LinkQueue<T>::makeEmpty()
{
    if (isEmpty()) return;
    T temp;
    while (!isEmpty())
    {
        pop(temp);
    }
}
template <class T>
int LinkQueue<T>::getSize()const
{
    int counter =0;
    linkNode<T>* temp=front;
    while (temp!=NULL)
    {
        counter++;
        temp=temp->link;
    }
    return counter;
}
template <class T>
ostream& operator<<(ostream& out,LinkQueue<T>& s)
{
    if (s.front==s.rear&&s.front==NULL)
    {
        out<<endl;
        return out;
    }
    linkNode<T>* current = s.front;
    while (current!=NULL)
    {
        out<<current->value<<" ";
        current=current->link;
    }
    return out;
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值