一篇学习笔记。
单链表实现队列:
- 插入:新元素插入队列尾部
- 弹出:从队列头部弹出(如果头部插入,尾部弹出,有什么区别?弹出时,从头遍历到尾部再弹出,效率低。增加一个指针指向尾部前一个节点可以提高效率,但增删的代码会复杂点,毕竟操作三个指针。另外,循环指针也可解决这个问题。)
- 判断空否: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;
}