数据结构之数组存储循环队列(C++实现)
本实验程序用于验证循环队列的基本操作算法,包括:入队、出队、取队头元素、取队尾元素、判队空或满、显示队列元素等。为了用户了解循环队列的循环特性,在基本操作中,增加了显示队尾或对头指针内容的功能。
附循环队列逻辑结构图
循环队列的定义及操作(CirQueue.h)如下:
#pragma once template<class T> class CirQueue { private: T *base; //储存空间基址 int front; //对头指针 int rear; //队尾指针 int queuesize; //队列容量 public: CirQueue(int m); //构造空队列 ~CirQueue(); //析构函数,释放链队各节点存储空间 void EnQueue(T x); T DeQueue(); T GetHead(); T GetLast(); int QueueEmpty(); int QueueFull(); void ClearQueue(); void Pointer(); void QueueTranverse(); }; template<class T> inline CirQueue<T>::CirQueue(int m) { base = new T[m]; if (base == NULL) { cout << "队列创建失败,退出!"; exit(1); } front = rear = 0; queuesize = m; } template<class T> inline CirQueue<T>::~CirQueue() { delete[] base; rear = 0; front = 0; queuesize = 0; } template<class T> inline void CirQueue<T>::EnQueue(T x) { if ((rear + 1) % queuesize == front) throw"上溢,无法入队!"; base[rear] = x; rear = (rear + 1) % queuesize; } template<class T> inline T CirQueue<T>::DeQueue() { T x; if (front == rear) throw"下溢,无法出队!"; x = base[front]; front = (front + 1) % queuesize; return x; } template<class T> inline T CirQueue<T>::GetHead() { T x; if (front == rear)throw"队空!"; x = base[front]; return x; } template<class T> inline T CirQueue<T>::GetLast() { T x; if (front == rear)throw"队空!"; x = base[rear-1]; return x; } template<class T> inline int CirQueue<T>::QueueEmpty() { if (front == rear) return 1; else return 0; } template<class T> inline int CirQueue<T>::QueueFull() { if ((rear + 1) % queuesize == front) return 1; else return 0; } template<class T> inline void CirQueue<T>::ClearQueue() { front = rear = 0; } template<class T> inline void CirQueue<T>::Pointer() { cout << "队首front=" << front << endl; cout << "队尾rare=" << rear << endl; } template<class T> inline void CirQueue<T>::QueueTranverse() { int i = front; while (i != rear) { cout << base[i] << '\t'; i = (i + 1) % queuesize; } cout << endl; }
程序结构图如下:
CirQueue_main主调程序
// CirQueue.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<process.h> #include<stdio.h> #include"CirQueue.h" using namespace std; char pause; int main() { int e; CirQueue<int>q(10); 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 << "9-输出队元素\n"; cout << "10-退出\n"; cout <<"Enter Choice:"; cin >> choice; switch (choice) { case 1: cout << "请输入要插入的元素值:"; cin >> e; cout << endl; q.EnQueue(e); cout << e << "如对成功!" << endl; cin.get(pause); system("pause"); break; case 2: try { e = q.DeQueue(); cout << "出队元素为:" << e << endl; } catch (char *eer) { cout << eer << endl; } cin.get(pause); system("pause"); break; case 3: try { e = q.GetHead(); cout << "队头元素为<<e<<endl"; } catch (char*eer) { cout << eer << endl; } cin.get(pause); system("pause"); break; case 4: try { e = q.GetLast(); cout << "队尾元素为<<e<<endl"; } catch (char*eer) { cout << eer << 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: if (q.QueueFull()) cout << "队满!" << endl; else cout << "队不满!" << endl; cin.get(pause); system("pause"); break; case 8: q.Pointer(); cin.get(pause); system("pause"); break; case 9: q.QueueTranverse(); cin.get(pause); system("pause"); break; case 10: break; default: cout << "选择不合理!"; break; } } while (choice != 10); return 0; }编译环境:windows 7;VisualStdio2015