数据结构之链式队列(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
转载须注明位置!