c++單鏈表實現隊列

 通過兩個鏈表節點指針實現隊列,一個當作隊頭,一個當作隊尾,入隊就是往尾節點後插入,退隊就是刪除頭節點

template<class T>
struct ListNode {
	T data;
	ListNode<T> *next;
	ListNode(const T & data) {
		this->data = data;
		this->next = nullptr;
	}
};

template<class T>
class Queue {
public:
	Queue();
	Queue(const Queue<T> & q);
	~Queue();
	void enQueue(const T & elem); // 入隊
	void deQueue(); // 退隊
	const T & front() const { return m_head->data; } // 返回隊頭元素
	const T & back() const { return m_tail->data; } // 返回隊尾元素
	const size_t size() const { return m_size; } // 返回隊列長度
	bool empty() const { return 0 == m_size; } // 判斷隊列是否爲空
private:
	ListNode<T> *m_head, *m_tail; // 記錄頭節點和尾節點
	size_t m_size;
};

template<class T>
Queue<T>::Queue()
{
	m_head = m_tail = nullptr;
	m_size = 0;
}

template<class T>
Queue<T>::Queue(const Queue<T>& q)
{
	ListNode<T> * temp = q.m_head;
	while (nullptr != temp) {
		enQueue(temp->data);
		temp = temp->next;
	}
}

template<class T>
Queue<T>::~Queue()
{
	ListNode<T> * temp = nullptr;
	while (nullptr != m_head) {
		temp = m_head;
		m_head = m_head->next;
		delete temp;
		temp = nullptr;
	}
	delete temp;
	temp = nullptr;
}

template<class T>
void Queue<T>::enQueue(const T & elem)
{
	if (empty()) {
		m_head = m_tail = new ListNode<T>(elem);
	}
	else {
		m_tail->next = new ListNode<T>(elem);
		m_tail = m_tail->next;
	}
	m_size++;
}

template<class T>
void Queue<T>::deQueue()
{
	/*try {
		if (empty()) {
			throw std::out_of_range;
		}
		else {
			ListNode<T> *temp = m_head;
			m_head = m_head->next;
			delete temp;
			temp = nullptr;
			m_size--;
		}
	}
	catch (std::out_of_range err) {
		
	}*/
	if (!empty()) {
		ListNode<T> *temp = m_head;
		m_head = m_head->next;
		delete temp;
		temp = nullptr;
		m_size--;
	}
}

int main() {
	Queue<int> q;
	q.deQueue();
	q.enQueue(1);
	q.enQueue(2);
	q.enQueue(3);
	Queue<int> q2(q);
	q2.deQueue();
	q.deQueue();
	q.deQueue();
	q.deQueue();
	q.enQueue(3);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章