在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
马上找工作了,最近又重新学起了数据结构,打算从现在开始,把学习过程中的心得体会和大家分享一下。当然这些内容会显得肤浅,但是希望会对新手有些帮助。大牛可以绕路咯。 好了,我们直奔主题,我们开始分析一下现实中的一中典型需求,以此作为开始: 实际问题: 一个运动会:有game_num个项目; 有anthelete_num名运动员; 每个运动员最多的参加max个项目; 问:怎么安排比赛才能使比赛组数最少(即如何安排各项比赛,既没有冲突,又使得比赛时间最短?)。
分析: 首先我们根据报名情况可以建立一个运动员参赛冲突关系矩阵collusion,是game_num*game_num的二维矩阵,元素0代表无冲突,1代表有冲突。例如,某个运动员报名的项目为(0,2,4)则对应的collusion[0][2],collusion[0][4],collusion[2][0],collusion[4][0],collusion[4][2],collusion[2][4]的值为1. 然后我们借助一个队列记录还未分组的项目,一个数组clash记录与该组冲突的比赛项目,其大小为game_num。
过程:初始时,把分组的组号初始化为0,并且把所有比赛项目进队列,表示所有项目都没有分组。 然后逐一出队列,进行分组,知道队列为空,分组完毕。 对于出队列的项目i,首先判断是否开始一轮新的比赛项目。一般出队列的项目号都大于先前出队列的项目号,如果小于,则说明开始一轮新的比赛项目,一个新的分组开始。此时,把分组的组号加1,数组clash置0, 准备下面的同组成员判定。 (1)如果数组项目i对应的元素clash[i]为0,表示当前组可以接受该项目,记录该项目i的分组号,且把该项目的比赛冲突信息叠加到数组clash中,即把运动员参赛冲突关系矩阵collusion的第i+1行叠加到数组clash上。理由是,当前组可以接受项目i,则与项目i冲突的比赛项目,也就是与该组冲突的项目,所以叠加记载到数组clash中。 (2)如果数组clash中项目i对应的元素clash[i]不为0,表示当前组不可以接受该项目,要将其重新进队列,等待下一轮的判定。
实现: 在程序中我们会用到队列这种数据结构(循环队列),所以我们对队列进行定义,定义数据结构的代码中难免有些冗余,这是为了我对数据结构学习的更全面一些。为了代码重用性更强一些,用到了类模板。 简单介绍下循环队列:队头指针指向第一个元素,队尾指针指向最后一个元素的下一个位置,队头指针前移方式front = (front + 1) % queueSize,队尾指针前移方式:rear = (rear + 1) % queueSize。 定义完队列以后,我们便开始程序的其他实现。
代码如下:
PreDefine.h
1 ///////////////////////////////////////////// 2 //SqQueue.h循环顺序队列数据结构C++定义 3 ////////////////////////////////////////////// 4 #include "PreDefine.h" 5 #include<assert.h> 6 #ifndef SQQUEUE_H 7 #define SQQUEUE_H 8 template <typename ElemType> 9 class SqQueue 10 { 11 public: 12 //把循环顺序队列置空 13 void clear(); 14 //判断循环队列是否为空 15 bool isEmpty(); 16 //出队列(删除循环顺序队列对头元素) 17 bool deQueue(ElemType& e); 18 //判断循环顺序队列是否满 19 bool isFull(); 20 //进队列 21 bool enQueue(ElemType e); 22 //读循环顺序队列头的元素 23 bool getFront(ElemType& e); 24 //求循环顺序队列中元素的个数 25 int getLenght(); 26 //重载赋值运算符的定义 27 SqQueue<ElemType>operator = (SqQueue<ElemType>rightQ); 28 29 //*************下面为系统自动调用的构造函数及析构函数声明********// 30 //构造函数 31 SqQueue(int size = 0); 32 //析构函数 33 ~SqQueue(); 34 //拷贝初始化构造函数 35 SqQueue(const SqQueue<ElemType>& otherQ); 36 37 protected: 38 int rear;//队尾指针 39 int front;//队头指针 40 int queueSize;//队列大小 41 ElemType *base;//队列基指针 42 }; 43 //******************循环顺序队列的实现*********************** 44 //队列置空 45 template<typename ElemType> 46 void SqQueue<ElemType>::clear() 47 { 48 front = rear; 49 } 50 //判读队列是否为空 51 template<typename ElemType> 52 bool SqQueue<ElemType>::isEmpty() 53 { 54 return front == rear ? TRUE : FALSE; 55 } 56 //出队列 57 template<typename ElemType> 58 bool SqQueue<ElemType>::deQueue(ElemType& e) 59 { 60 if (isEmpty()) 61 return FALSE; 62 e = base[front]; 63 front = (front + 1) % queueSize;//对头指针前移 64 return OK; 65 } 66 //判断队列是否满 67 template <typename ElemType> 68 bool SqQueue<ElemType>::isFull() 69 { 70 return (rear + 1) % queueSize == front% queueSize ? TRUE : FALSE; 71 } 72 //进队列 73 template<typename ElemType> 74 bool SqQueue<ElemType>::enQueue(ElemType e) 75 { 76 if (isFull()) 77 return FALSE; 78 base[rear] = e; 79 rear = (rear + 1) % queueSize;//队尾指针前移 80 return OK; 81 } 82 //读队列的头元素 83 template <typename ElemType> 84 bool SqQueue<ElemType>::getFront(ElemType& e) 85 { 86 if (isEmpty()) 87 return ERROR; 88 e = base[front]; 89 return OK; 90 } 91 //求队列中元素的个数 92 template <typename ElemType> 93 int SqQueue<ElemType>::getLenght() 94 { 95 return (rear - front + queueSize) % queueSize; 96 } 97 //重载赋值运算符 98 template<typename ElemType> 99 SqQueue<ElemType> SqQueue<ElemType>::operator=(SqQueue<ElemType> rightQ) 100 { 101 if (this != &rightQ)//如果左右队列不一样 102 { 103 if (queueSize != rightQ.queueSize)//如果左右队列的大小不一样,则重新为左边队列分配空间 104 { 105 delete[] base; 106 base = new ElemType[rightQ.queueSize]; 107 assert(base != 0); 108 queueSize = rightQ.queueSize; 109 110 } 111 //将右边的队列元素赋值到左边的队列中 112 front = rightQ.front; 113 rear = rightQ.rear; 114 for (int j = fron; j %queueSize != rear;) 115 { 116 base[j] = rightQ.base[j]; 117 j = (j + 1) % queueSize;//指针前移 118 119 } 120 } 121 return *this; 122 } 123 124 125 //******************************下面为系统自动调用的构造函数和析构函数的实现*********** 126 //构造函数 127 template <typename ElemType> 128 SqQueue<ElemType> ::SqQueue(int size) 129 { 130 base = new ElemType[size]; 131 assert(base != 0); 132 front = rear = 0; 133 queueSize = size; 134 } 135 //析构函数 136 template <typename ElemType> 137 SqQueue<ElemType>::~SqQueue() 138 { 139 delete[]base; 140 } 141 //赋值构造函数 142 template<typename ElemType> 143 SqQueue<ElemType> ::SqQueue(const SqQueue<ElemType>& otherQ) 144 { 145 base = new ElemType[otherQ.queueSize]; 146 aseert(base != 0); 147 queueSize = otherQ.queueSize; 148 front = otherQ.front; 149 rear = otherQ.rear; 150 for (int j = front; j%queueSize != rear;) 151 { 152 base[j] = otherQ.base[j]; 153 j = (j + 1) % queueSize; 154 155 } 156 } 157 #endif MySportsManagement.h 全部评论
专题导读
上一篇:C#上传附件,以及下载实现发布时间:2022-07-13下一篇:errorC2338:NoQ_OBJECTintheclasswiththesignal(NodeCreator.cpp)发布时间:2022-07-13热门推荐
热门话题
阅读排行榜
|
请发表评论