数据结构之链式队列(C++实现)

数据结构之链式队列(C++实现)

本实验程序用于验证链队的基本操作算法,包括:入队、出队、取队顶元素、测队空等。链表头为队首,链表尾为队尾。

(1)因链队中队首、队尾指针不能反映队列中元素的位序关系,删除了队头、队尾位置查看操作。

(2)因为链队不存在队满,省去了其中测队满的功能。

链式队列定义、实现如下:

#pragma once
//链队
//VS2015;Windows7 4G 64位;
//头结点不存数据
template<class T>
struct Node
{
	T data;                                      //数据域,存队列数据
	Node<T>* next;                               //指针域,指向下一个位置
};

template<class T>
class LinkQueue                                  //抽象出队列的类,定义操作函数,变量
{
private:
	Node<T>* front;                              //队头指针
	Node<T>* rear;                               //队尾指针
public:
	LinkQueue();                                 //构造函数,系统自动调用,构造空队列
	~LinkQueue();                                //析构函数,释放链队各节点的存储空间
	void EnQueue(T x);                           //入队
	T DeQueue();                                 //出队
	T GetHead();                                 //获取队头元素
	T GetLast();                                 //获取队尾元素
	int QueueEmpty();                            //判队空
	void ClearQueue();                           //清空队
	void QueueTranverse();                       //遍历队
};

template<class T>
LinkQueue<T>::LinkQueue()
{
	front = new Node<T>;
	front->next = NULL;
	rear = front;                                 //空队
}

template<class T>
LinkQueue<T>::~LinkQueue()                       //析构,销毁队
{
	Node<T>*p;
	while (front != NULL)
	{
		p = front;
		front = front->next;
		delete p;
	}
}

template<class T>
void LinkQueue<T>::EnQueue(T x)
{
	Node<T> *s;
	s = new Node<T>;
	s->data = x;
	s->next = rear->next;
	rear->next = s;
	rear = s;
	if (front->next == NULL)
		front->next = s;
}

template<class T>
T LinkQueue<T>::DeQueue()
{
	T x;
	Node<T>*p;
	if (rear == front)throw"下溢";
	p = front->next;
	x = p->data;
	front->next = p->next;
	if (p->next == NULL)
		rear = front;
	delete p;
	return x;
}

template<class T>
T LinkQueue<T>::GetHead()
{
	Node<T>* p;
	if (rear == front)throw"队空,无队头元素!";
	p = front->next;
	return p->data;
}

template<class T>
T LinkQueue<T>::GetLast()
{
	if (rear == front)throw"队空,无队头元素!";
	return rear->data;
}

template<class T>
void LinkQueue<T>::ClearQueue()
{
	Node<T>*p;
	p = front->next;
	while (p)
	{
		front->next = p->next;
		delete p;
		p = front->next;
	}
	rear = front;
}

template<class T>
int LinkQueue<T>::QueueEmpty()
{
	if(rear==front)
		return true;
	else
		return false;
}

template<class T>
void LinkQueue<T>::QueueTranverse()
{
	Node<T>*p;
	p = front->next;
	while (p)
	{
		cout << p->data << '\t';
		p = p->next;
	}
	cout << endl;
}


测试应用验证程序如下:

// LinkQueue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include"LinkQueue.h"
#include<stdio.h>
#include<process.h>
using namespace std;
char pause;
int main()
{
	int e;
	LinkQueue< int> q;
	system("cls");
	int choice;
	do                                           //显示主菜单
	{
		cout << "1一人队\n";
		cout << "2一出队\n";
		cout << "3一取队头元素\n";
		cout << "4一取队尾元素\n";
		cout << "5一置队空\n";
		cout << "6一测队空\\n";
		cout << "7一输出队元素\n";
		cout << "8一退出\n";
		cout << "Enter choice:";
		cin >> choice;
		switch (choice)
		{
		case 1:                                  //入队
			cout << "请输人插人元素的值:";
			cin >> e;
			cout << endl;
			q.EnQueue(e);
			cin.get(pause);
			system("pause");
			break;
		case 2:                                  //出队
			try
			{
				e = q.DeQueue();
				cout << "出队元素为:" << e << endl;
			}
			catch (char * err)
			{
				cout << err << endl;
			}
			cin.get(pause);
			system("pause");
			break;
		case 3:                                  //获取队头元素
			try
			{
				e = q.GetHead();
				cout << "队头元素为:" << e << endl;
			}
			catch (char* err)
			{
				cout << err << endl;
			}
			cin.get(pause);
			system("pause");
			break;
		case 4:                                  //获取队尾元素
			try
			{
				e = q.GetLast();
				cout << "队尾元素为:" << e << endl;
			}
			catch (char* err)
			{
				cout << err << endl;
			}
			cin.get(pause);
			system("pause");
			break;
		case 5:                                   //清空队
			q.ClearQueue();
			cin.get(pause);
			system("pause");
			break;
		case 6:                                  //测队空
			if (q.QueueEmpty())
				cout << "队空" << endl;
			else
				cout << "队不空" << endl;
			cin.get(pause);
			system("pause");
			break;
		case 7:                                  //遍历队
			q.QueueTranverse();
			cin.get(pause);
			system("pause");
			break;
		case 8:									 //退出
			break;
		default:
			cout << "Invalied Choice!\n";
			break;
		}
	} while (choice != 8);
		return 0;
}//end of main function
转载须注明位置!

猜你喜欢

转载自blog.csdn.net/wwl15840210640/article/details/80806610