数据结构(Course)4:队列

队列(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);
}

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/81388253