1. 程式人生 > >C++習題練習(鏈式佇列)

C++習題練習(鏈式佇列)

函式宣告:

#include <iostream>
#include <stdio.h>
using namespace std;

#define TRUE 1
#define FALSE 0

typedef int ElemType;

class Node
{
private:		
public:
	ElemType _data;
	Node*  _next;
	Node()
	{
		cout << "結點建構函式" <<endl;	
	}

	~Node()
	{
		cout << "結點解構函式" <<endl;	
	}
};

class Queue
{
private:
	Node* _head;
	Node* _tail;

public:
	//建構函式
	Queue()
	{
		cout << "佇列建構函式" <<endl;
		_head = new Node();
		_tail = _head;
	}
	//拷貝建構函式
	Queue(const Queue& queue)
	{
		cout << "拷貝建構函式" <<endl;
		_head = new Node();
		_tail = _head;

		Node *s = queue._head;
		while( s != queue._tail)
		{	
			_tail->_data = s->_data;	
			s = s->_next;
			_tail->_next = new Node();
			_tail = _tail->_next;
		}
	}

	//等號運算子過載函式
	Queue& operator = (const Queue& queue)
	{
		cout << "等號運算子過載函式" <<endl;
		if(this == &queue)
		{
			return *this;
		}

		if(!IsEmpty_Queue())
		{
			while(!IsEmpty_Queue())
			{
				Node* next_head = _head->_next;
				delete _head;
				_head = next_head;
			}		
		}

		_head = new Node();
		_tail = _head;

		Node *s = queue._head;
		while( s != queue._tail)
		{	
			_tail->_data = s->_data;	
			s = s->_next;
			_tail->_next = new Node();
			_tail = _tail->_next;
		}
		return *this;
	}

	//解構函式
	~Queue()
	{
		cout << "佇列解構函式" <<endl;

		while(_head != _tail)
		{
			Node* p = _head;
			_head = _head->_next;
			delete p;
			p = NULL;
		}
		_head = _tail = NULL;
	}
	//判斷佇列是否為空
	int IsEmpty_Queue();

	//進佇列
	void Push_Queue(ElemType val);

	//出佇列
	void Pop_Queue();

	//獲取元素值
	ElemType Get_data();

	//得到佇列的長度
	int Get_len();

	//列印佇列資料
	void Show_Queue();

};

函式實現:

#include "Queue.h"

//判斷佇列是否為空
int Queue::IsEmpty_Queue()
{
	if(_head == _tail)
	{
		return TRUE;
	}
	return FALSE;
}

//進佇列
void Queue::Push_Queue(ElemType val)
{
	_tail->_data = val;
	_tail->_next = new Node();
	_tail = _tail->_next;
}

//獲取元素值
ElemType Queue::Get_data()
{
	return _head->_data;
}

//出佇列
void Queue::Pop_Queue()
{
	Node* Next_Node = _head->_next;
	delete _head;
	_head = Next_Node;
}

//得到佇列的長度
int Queue::Get_len()
{
	Node *p = _head;
	int count = 0;
	while(p != _tail)
	{
		count ++;
		p = p->_next;
	}
	return count;
}

//列印佇列資料
void Queue::Show_Queue()
{
	if(IsEmpty_Queue())
	{
		cout << "Queue is Empty!"<<endl;
		return ;
	}
	else
	{
		Node *p = _head;
		while(p != _tail)
		{
			cout << p->_data <<" ";
			p = p->_next;
		}
		cout << endl;
		return;
	}	
}

函式測試:

#include "Queue.h"

int main()
{
	Queue queue;

	//判空測試
	if(queue.IsEmpty_Queue())
	{
		cout << "queue is empty!" << endl;
	}
	else
	{
		cout << "queue is not empty!" << endl;
	}

	//入隊測試
	for(int i = 0; i < 10; i++)
	{
		queue.Push_Queue(i);
	}

	if(queue.IsEmpty_Queue())
	{
		cout << "queue is empty!" << endl;
	}
	else
	{
		cout << "queue is not empty!" << endl;
	}
	//列印測試
	queue.Show_Queue();
	//求長度測試
	int len = queue.Get_len();
	cout << "len = "<< len << endl;

	//出隊測試
	cout << "data:";
	for(int i = 0; i < 3; i++)
	{
		int tmp = queue.Get_data();
		//刪除測試
		queue.Pop_Queue();
		cout << tmp << " " ;

	}
	cout << endl;
	queue.Show_Queue();

	return 0;
}