版权声明: https://blog.csdn.net/moon_sky1999/article/details/83998915
外接线性表(链表实现)
#pragma once
#include "chain.h"
template<class T>
class queue {
public:
virtual ~queue() {}
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T &front() = 0;
virtual T &back() = 0;
virtual void pop() = 0;
virtual void push(const T &theElement) = 0;
};
template<class T>
class LinkedQueue : public queue<T> {
public:
LinkedQueue();
~LinkedQueue();
bool empty() const { return queueSize == 0; }
int size() const { return queueSize; }
T &front();
T &back();
void push(const T &theElement);
void pop();
private:
chainNode<T> *queueFront;
chainNode<T> *queueBack;
int queueSize;
};
template<class T>
LinkedQueue<T>::LinkedQueue() {
queueFront = NULL;
queueSize = 0;
}
template<class T>
LinkedQueue<T>::~LinkedQueue() {
while (queueFront) {
chainNode<T> *nextNode = queueFront->next;
delete queueFront;
queueFront = nextNode;
}
}
template<class T>
T &LinkedQueue<T>::front() {
if (queueSize == 0)
throw "error";
return queueFront->element;
}
template<class T>
T &LinkedQueue<T>::back() {
if (queueSize == 0)
throw "error";
return queueBack->element;
}
template<class T>
void LinkedQueue<T>::push(const T &theElement) {
chainNode<T> *newNode = new chainNode<T>(theElement, NULL);
if (queueSize != 0)
queueBack->next = newNode;
else queueFront = newNode;
queueBack = newNode;
queueSize++;
}
template<class T>
void LinkedQueue<T>::pop() {
if (queueFront == NULL)
throw "empty";
chainNode<T> *nextNode = queueFront->next;
delete queueFront;
queueFront = nextNode;
queueSize--;
}