Train.cpp
上传用户:stella1212
上传日期:2022-08-06
资源大小:567k
文件大小:4k
开发平台:

Visual C++

  1. #include "Train.h"
  2. #include"Stack.h"
  3. Train::Train(void)
  4. {
  5. train_length = 0;
  6. train_sequence = NULL;
  7. track_number = 0;
  8. }
  9. //train函数从使用者那里那里获取火车厢的个数,火车厢的原始序列以及可以使用的缓冲铁轨的个数
  10. bool Train::read()
  11. {
  12.     cout<<endl;
  13. cout<<"The number of trian carriages you want you to rearrange is:"<<endl;
  14. cin >> train_length;
  15. while( train_length <= 0 || train_length != (int)train_length)
  16. {
  17. cout<<"The number of train carriages you have just input didn't satisfied requirement!"<<endl;
  18. cout<<"Please input another interger!"<<endl;
  19. cin>>train_length;
  20. }
  21. cout<<"The initial sequence of the train carriages is:"<<endl;
  22. //用于动态申请内存
  23. train_sequence = new int[train_length];
  24.     //flag 做标记,用于控制输入
  25. int flag = 0;
  26. do{
  27. //输入火车车厢的序列
  28. for(int i = 0;i < train_length ; i++)
  29. {
  30. cin>>train_sequence[i];
  31. }
  32. //检测输入的火车车厢序列是否正确,如果不正确 就跳出循环,同时将flag标记为train_length;
  33. for(int i = 0;i < train_length ; i++)
  34. {
  35. if( train_sequence[i] <= 0||train_sequence[i] > train_length || train_sequence[i] != (int)train_sequence[i])
  36. {
  37. cout<<"The sequence of train carriages you have just input didn't satisfied requirement!"<<endl;
  38. cout<<"Please input another sequence!"<<endl;
  39. i = flag = train_length;
  40. break;
  41. }
  42. flag = 0;
  43. }
  44. //检查输入的火车序列中是否有相同编号的火车,如果有相同编号的火车则直接跳出循环
  45. int count = 0;
  46. for(int i = 0;i < train_length ;i++)
  47. {
  48. for(int j = (i + 1);j < train_length ;j++)
  49. {
  50. if(train_sequence[i] == train_sequence[j])
  51. {
  52.                      count++;
  53. }
  54. }
  55. }
  56. if(count != 0)
  57. {   
  58. cout<<"The sequence of train carriages you have just input have "<<count<<" pairs of same number!"<<endl;
  59. cout<<"Please input another sequence!"<<endl;
  60. flag = 1;
  61. }
  62. }while(flag != 0);
  63.  
  64.     // 从用户处获得缓冲铁轨的个数并进行判断
  65. cout<<"Please input the number of tracks you require us to use:"<<endl;
  66. cin>>track_number;
  67. while(track_number != (int)track_number||track_number < 0 ||track_number >= train_length)
  68. {
  69. cout<<"The number of tracks you have input didn't satisfised requirement!"<<endl;
  70. cout<<"Please input another number!"<<endl;
  71. cin>>track_number;
  72. }
  73. return true;
  74. }
  75. //Railroad 重排入轨中的火车厢,然后将它们输出
  76. bool Train::Railroad()
  77. {
  78. Stack *track_rail = new Stack[track_number+1];//动态创建指向栈的数组,每个元素代表一个缓冲铁轨
  79. int NowOut = 1;//NowOut 代表将要输出的铁轨
  80. int minH = train_length + 1;//minH代表所有缓冲铁轨中最小的车厢标号
  81. int minS;//minS是与minH所在的缓冲铁轨
  82. for(int i = 0;i < train_length ;i++)
  83. {
  84. if(train_sequence[i] == NowOut)
  85. {
  86. cout<<"Move carriage " << train_sequence[i]<<" from input to output!"<<endl;
  87. NowOut++;
  88.         while(NowOut == minH)
  89. {
  90. Output(minH,minS,track_rail);
  91. NowOut++;
  92. }
  93. }
  94. else
  95. {
  96. if(!Hold(train_sequence[i],minH,minS,track_rail))
  97. return false;
  98. }
  99. }
  100. return true;
  101. }
  102. //Output函数将minS中的minH火车输出,同时,找到新的minH和minS
  103. void Train::Output(int &minH,int &minS,Stack* track_rail)
  104. {
  105. int c;
  106. track_rail[minS].pop();
  107. cout<<"Move carriage  "<<minH<<" from track "<<minS<<" to output!"<<endl;//输出车厢
  108. //重置minH和minS的值
  109. minH = train_length + 2;
  110. for(int i = 0;i <= track_number;i++)
  111. {
  112.        if( track_rail[i].top(c) !=underflow)
  113.    {
  114. if(!track_rail[i].empty() && c < minH)
  115. {
  116. minH = c;
  117. minS = i;
  118. }
  119.    }
  120. }
  121. }
  122. //将c放入到一个铁轨中,如果没有可用的铁轨,则返回false;如果内存不足导致无法放置,那么返回一个异常
  123. bool Train::Hold( int c,int &minH, int &minS,Stack* track_rail)
  124. {
  125.    // Stack *track_rail = new Stack[track_number];
  126. //为车厢c寻找最优的缓冲铁轨
  127. int BestTrack = 0;//最优铁轨
  128. int BestTop = train_length + 1;//最优铁轨的顶部元素
  129. int x_top;
  130. //扫描缓冲铁轨
  131.     for(int i = 0;i <= track_number;i++)
  132. {
  133. if(!track_rail[i].empty())//铁轨不为空
  134. {
  135. track_rail[i].top(x_top);
  136. if( c < x_top && x_top < BestTop)
  137. {
  138. BestTrack = i ;
  139. BestTop = x_top;
  140. }
  141. }
  142. else if(!BestTrack)
  143. {
  144. BestTrack = i ;
  145. //i = track_number;
  146. }
  147. }
  148. //没有可用的铁轨返回FALSE;
  149. if(BestTrack == 0)
  150. return false;
  151. //将c输入到最优缓冲铁轨中
  152. track_rail[BestTrack].push(c);
  153. cout<<"Move carriage "<< c <<" from input to track "<< BestTrack <<endl;
  154.     if(c < minH)
  155. {
  156. minH = c;
  157. minS = BestTrack;
  158. }
  159.     return true;
  160. }
  161. Train::~Train(void)
  162. {
  163. delete []train_sequence;
  164. }