队列——顺序存储结构及其基本运算(循环队列)

来源:互联网 发布:java如何求素数 编辑:程序博客网 时间:2024/05/19 15:44

该文章主要介绍循环队列的顺序存储结构以及相关运算。

头文件:CSqQueue.h

template <typename T>class SqQueueClass1//循环队列类模板{T *data;  //存放队中元素int front, rear;//队头和队尾指针public://================循环队基本运算算法==========================SqQueueClass1();//构造函数~SqQueueClass1();//析构函数bool QueueEmpty1();//判断队列是否为空bool enQueue1(T e);//进队列算法bool deQueue1(T &e);//出队列算法//================循环队其他运算算法=========================template <typename C>friend void Display(SqQueueClass1<C> &qu);//从队头到队尾输出队中所有元素template <typename C>friend int GetCount(SqQueueClass1<C> &qu);//返回队中元素个数template <typename C>friend bool enQueuek(SqQueueClass1<C> &qu, int k, C e);//进队第k个元素etemplate <typename C>friend bool deQueuek(SqQueueClass1<C> &qu, int k, C &e);//出队第k个元素e};

源文件:CSqQueue.cpp

#include <iostream>#include "CSqQueue.h"const int MaxSize = 100;//================循环队基本运算算法==========================template <typename T>SqQueueClass1<T>::SqQueueClass1()//构造函数{data = new T[MaxSize];front = rear = 0;}template <typename T>SqQueueClass1<T>::~SqQueueClass1()//析构函数{delete[] data;}template <typename T>bool SqQueueClass1<T>::QueueEmpty1()//判断队列是否为空{return (front == rear);}template <typename T>bool SqQueueClass1<T>::enQueue1(T e)//进队列算法{if ((rear + 1) % MaxSize == front)return false;rear = (rear + 1) % MaxSize;data[rear] = e;return true;}template <typename T>bool SqQueueClass1<T>::deQueue1(T &e)//出队列算法{if (front == rear)return false;front = (front + 1) % MaxSize;e = data[front];return true;}//================循环队基本其他运算算法========================template <typename T>void Display(SqQueueClass1<T> &qu)//从队头到队尾输出队中所有元素{int i = qu.front;while (i != qu.rear){i = (i + 1) % MaxSize;cout << qu.data[i] << " ";}cout << endl;}template <typename T>int GetCount(SqQueueClass1<T> &qu)//返回队中元素个数{return ((qu.rear - qu.front + MaxSize) % MaxSize);}template <typename T>bool enQueuek(SqQueueClass1<T> &qu, int k, T e) //进队第k个元素e{T x;int i = 1, n = GetCount(qu);if (k<1 || k>n + 1) return false;if (k <= n)for (i = 1; i <= n; i++){if (i == k) qu.enQueue1(e);qu.deQueue1(x);qu.enQueue1(x);}else qu.enQueue1(e);//k=n+1时直接进队ereturn true;}template <typename T>bool deQueuek(SqQueueClass1<T> &qu, int k, T &e)//出队第k个元素e{T x;int i = 1, n = GetCount(qu);if (k<1 || k>n) return false;for (i = 1; i <= n; i++){qu.deQueue1(x);if (i != k) qu.enQueue1(x);else e = x;}return true;}

主函数:main.cpp

#include<iostream>#include"CSqQueue.cpp"using namespace std;//=================循环队基本运算算法====================void main1(){SqQueueClass1<char> sq;//定义一个字符顺序队sqchar e;cout << "建立一个空队sq\n";cout << "队sq" << (sq.QueueEmpty1()?"空":"不空") << endl;cout << "元素a进队\n"; sq.enQueue1('a');cout << "元素b进队\n"; sq.enQueue1('b');cout << "元素c进队\n"; sq.enQueue1('c');cout << "元素d进队\n"; sq.enQueue1('d');cout << "元素e进队\n"; sq.enQueue1('e');cout << "队sq" << (sq.QueueEmpty1()?"空":"不空") << endl;cout << "所有元素出队次序:";while (!sq.QueueEmpty1())//队不空循环{sq.deQueue1(e);//出队元素ecout << e << " ";//输出元素e}cout << endl;cout << "销毁队sq" << endl;}//==================循环队基本其他运算算法=====================void main(){SqQueueClass1<char> sq;//定义一个字符顺序队sqchar e;cout << "建立一个空队sq\n";cout << "元素a进队\n"; sq.enQueue1('a');cout << "元素b进队\n"; sq.enQueue1('b');cout << "元素c进队\n"; sq.enQueue1('c');cout << "元素d进队\n"; sq.enQueue1('d');cout << "元素e进队\n"; sq.enQueue1('e');cout << "sq中元素个数:" << GetCount(sq) << endl;cout << "进队第2个元素x" << endl;enQueuek(sq, 2, 'x');cout << "队头到队尾元素:"; Display(sq);cout << "出队第4个元素" << endl;deQueuek(sq, 4, e);cout << "第4个元素为" << e << endl;cout << "队头到队尾元素:"; Display(sq);cout << "销毁队sq" << endl;}



阅读全文
0 0
原创粉丝点击