【链性队列】模拟机排序
1 //模拟机排序 2 //运用链性队列(先进先出) 3 // 4 5 #include<iostream> 6 7 using namespace std; 8 9 typedef struct _NODE_ 10 { 11 int a; //没有再用一个DATA来封数据域,这里只有数据 int a 12 _NODE_* pNext; 13 14 }Node,*pNode; 15 16 17 18 class CQueue //封装成queue类 19 { 20 private: //私有成员pTop 和 pBase 21 pNode pTop; 22 pNode pBase; 23 int iNodeCount; 24 25 26 public: 27 CQueue() //构造函数 和 析构函数 28 { 29 pTop = pBase = NULL; 30 iNodeCount = 0; 31 } 32 ~CQueue() 33 { 34 35 } 36 // 初始化, 进队, 出队, 判断为空, 销毁 37 void InitQueue(); 38 bool InQueue(int a); 39 bool OutQueue(int &a); 40 bool IsEmpty(); 41 42 void DestroyQueue(); 43 44 }; 45 46 47 48 49 void CQueue::InitQueue() 50 { 51 if(pTop != NULL || iNodeCount != 0) 52 { 53 DestroyQueue(); 54 } 55 pTop = pBase = NULL; 56 iNodeCount = 0; 57 } 58 59 60 bool CQueue::InQueue(int a) 61 { 62 //新建立一个结点,并将a的值赋给结点结构体中的变量a; 63 pNode pNodeTemp = new Node; 64 65 if(pNodeTemp != NULL) 66 { 67 pNodeTemp->a = a; 68 pNodeTemp->pNext = NULL; 69 70 //如果队列中没有结点 71 if(pTop == NULL) 72 { 73 pTop = pBase = pNodeTemp; 74 } 75 //否则,用一般的尾插法. 76 else 77 { 78 pBase->pNext = pNodeTemp; 79 pBase = pNodeTemp; 80 } 81 82 //iNodeCount ++ 计数 83 84 iNodeCount++; 85 86 return true; 87 } 88 //如果申请结点未成功,返回false 89 return true; 90 91 } 92 bool CQueue::OutQueue(int &a) 93 { 94 if(pTop == NULL) 95 { 96 return false; 97 } 98 //先进先出的特性就是尾插然后头出 99 else 100 { 101 pNode pNodeTemp = pTop; 102 103 pTop = pTop->pNext; 104 105 a = pNodeTemp->a; 106 107 delete pNodeTemp; 108 109 iNodeCount--; 110 111 if(iNodeCount == 0) 112 { 113 pBase = NULL; 114 } 115 return true; 116 } 117 } 118 119 120 bool CQueue::IsEmpty() 121 { 122 if(iNodeCount == 0) 123 { 124 return true; 125 } 126 127 return false; 128 } 129 130 void CQueue::DestroyQueue() 131 { 132 pNode pNodeTemp = pTop; 133 134 while(pTop != NULL) 135 { 136 pNodeTemp = pTop->pNext; 137 138 delete pTop; 139 140 pTop = pNodeTemp; 141 142 iNodeCount--; 143 } 144 145 if(iNodeCount == 0) 146 { 147 pBase = NULL; 148 } 149 } 150 151 152 int main() 153 { 154 CQueue Object[10]; 155 156 int i = 0; 157 int j = 0; 158 int b = 0; 159 160 161 int a[11]={113,241,423,235,242,758,666,575,484,898,603}; 162 //三位数的模拟机测试 163 for(i=0;i<11;i++) 164 { 165 cout<<a[i]<<" "; 166 } 167 168 for(i=0;i<11;i++) 169 { 170 b = a[i]%10; 171 172 Object[b].InQueue(a[i]); 173 } 174 for(i=0,j=0;i<10;i++) 175 { 176 while(!Object[i].IsEmpty()) 177 { 178 Object[i].OutQueue(a[j]); 179 j++; 180 } 181 } 182 183 cout<<endl; 184 185 for(i=0;i<11;i++) 186 { 187 cout<<a[i]<<" "; 188 } 189 for(i=0;i<10;i++) 190 { 191 Object[i].InitQueue(); 192 } 193 194 for(i=0;i<11;i++) 195 { 196 b = a[i]/10%10; 197 198 Object[b].InQueue(a[i]); 199 } 200 for(i=0,j=0;i<10;i++) 201 { 202 while(!Object[i].IsEmpty()) 203 { 204 Object[i].OutQueue(a[j]); 205 j++; 206 } 207 } 208 209 cout<<endl; 210 211 for(i=0;i<11;i++) 212 { 213 cout<<a[i]<<" "; 214 } 215 216 for(i=0;i<10;i++) 217 { 218 Object[i].InitQueue(); 219 } 220 221 222 223 224 for(i=0;i<11;i++) 225 { 226 b = a[i]/10/10; 227 228 Object[b].InQueue(a[i]); 229 } 230 for(i=0,j=0;i<10;i++) 231 { 232 while(!Object[i].IsEmpty()) 233 { 234 Object[i].OutQueue(a[j]); 235 j++; 236 } 237 } 238 239 cout<<endl; 240 241 for(i=0;i<11;i++) 242 { 243 cout<<a[i]<<" "; 244 } 245 246 cout<<endl; 247 248 249 return 0; 250 }