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