队列(FIFO先进先出)
队尾插入队列,队头删除操作。入队列O(1),出队列O(n),要所有后面的前移一位。
队列的抽象数据类型
template<class T>
class Queue
{
void clear();
bool isEmpty();
bool isFull();
bool enQueue(const T item);//将item插入队尾,成功返回true
bool deQueue(T& item);//返回队头元素并将其删除,成功返回true
bool getFront(T& item);//返回队头但不删除
};
。元素长度=real-front+1
指针front指向队头元素,rear指向队尾元素下一个位置。
出现“假溢出”现象————循环队列。
front与rear相差一个位置就是满。在循环队列结构下,当front==rear时为空队列,当(rear+1)%maxSize == front时为满队列。满队时实际仍有一个元素的空间未使用,这是为了与空队列的判断标准区分开。
计算队列长度公式maxsize-front;0+rear------(rear-front+maxsize)%maxsize;
顺序结构:
//队列的顺序表示,循环队列
template <typename T>
class SeqQueue :public Queue < T >
{
private:
int front, rear; //front指向队头元素的前一单元,rear指向队尾元素
int maxSize; //数组的最大长度
T *q;
public:
//构造函数
SeqQueue(int mSize)
{
maxSize = mSize;
q = new T[maxSize];
front = rear = 0;
}
//析构函数
~SeqQueue()
{
delete[]q;
}
};
插入队尾
template <typename T>
bool SeqQueue<T>::Enqueue(T x)
{
if (IsFull()) {
cout<<"Full"<<endl;
return false;
}
rear = (rear + 1) % maxSize;
q[rear] = x;
return true;
}
删除头元素
template <typename T>
bool SeqQueue<T>::Dequeue()
{
if (IsEmpty()) {
cout<<"Empty"<<endl;
return false;
}
front = (front + 1) % maxSize;
return true;
}
链式结构
队头指针front充当链表的表头结点,队尾指针rear指向队尾结点。
template <class T>
//节点
class Node
{
private:
T value;
Node<T>* next;
friend class singleQuene<T>;
};
template <class T>
//顺序结构栈继承栈
class singleQuene :public Quene < T >
{
private:
Node<T>* front;
Node<T>* rear;
public:
//构造函数
singleQuene()
{
front = new Node < T > ;
front->next = NULL;
rear = front;
}
//析构函数
~singleQuene()
{
Node<T>* p;
while (head != NULL)
{
p = head;
front = front->next;
delete(p);
}
}
};
插入队尾
template <typename T>
bool SingleQueue<T>::Enqueue(T x) {
Node<T>* p = new Node<T>;
p->element = x;
p->next = NULL;
rear->next = p;
rear = p;
}
删除头元素
template <typename T>
bool SingleQueue<T>::Dequeue()
{
if (IsEmpty()) {
cout<<"Empty"<<endl;
return false;
}
Node<T> *p = front->next;
front->next = p->next;
delete (p);
}