072.火车车厢重排

举报
C语言与CPP编程 发表于 2022/05/01 23:34:50 2022/05/01
【摘要】 #include "stdafx.h"#include "stdio.h"#include "iostream.h"#include "stdlib.h"#include "malloc.h"#include "string.h"#define StackSize 100 //假定预分配的栈空间最多为100个元素 #define Max...

  
  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "iostream.h"
  4. #include "stdlib.h"
  5. #include "malloc.h"
  6. #include "string.h"
  7. #define StackSize 100 //假定预分配的栈空间最多为100个元素
  8. #define MaxLength 100// 最大的字符串长度
  9. typedef int DataType;//假定栈元素的数据类型为整数
  10. typedef struct{
  11. DataType data[StackSize];
  12. int top;
  13. }SeqStack;
  14. // 置栈空
  15. void Initial(SeqStack *S)
  16. {//将顺序栈置空
  17. S->top=-1;
  18. }
  19. //判栈空
  20. int IsEmpty(SeqStack *S)
  21. {
  22. return S->top==-1;
  23. }
  24. //判栈满
  25. int IsFull(SeqStack *S)
  26. {
  27. return S->top==StackSize-1;
  28. }
  29. //进栈
  30. void Push(SeqStack *S,DataType x)
  31. {
  32. if (IsFull(S))
  33. {
  34. printf("栈上溢"); //上溢,退出运行
  35. exit(1);
  36. }
  37. S->data[++S->top]=x;//栈顶指针加1后将x入栈
  38. }
  39. //出栈
  40. DataType Pop(SeqStack *S)
  41. {
  42. if(IsEmpty(S))
  43. {
  44. printf("栈为空"); //下溢,退出运行
  45. return -1;
  46. }
  47. return S->data[S->top--];//栈顶元素返回后将栈顶指针减1
  48. }
  49. // 取栈顶元素
  50. DataType Top(SeqStack *S)
  51. {
  52. if(IsEmpty(S))
  53. {
  54. printf("栈为空"); //下溢,退出运行
  55. exit(1);
  56. }
  57. return S->data[S->top];
  58. }
  59. int Hold(int c,int *minH, int *minS,SeqStack H[],int k, int n)
  60. {// 在一个缓冲铁轨中放入车厢c
  61. // 如果没有可用的缓冲铁轨,则返回0
  62. // 如果空间不足,则引发异常N o M e m
  63. // 否则返回1
  64. // 为车厢c寻找最优的缓冲铁轨
  65. // 初始化
  66. int BestTrack = 0,i; // 目前最优的铁轨
  67. int BestTop = n + 1;// 最优铁轨上的头辆车厢
  68. int x;// 车厢索引
  69. //扫描缓冲铁轨
  70. for (i = 1; i <= k; i++)
  71. if (IsEmpty(&H[i]))
  72. {// 铁轨i 不空
  73. x = Top (&H[i]) ;
  74. if (c<x && x < BestTop)
  75. {//铁轨i 顶部的车厢编号最小
  76. BestTop = x;
  77. BestTrack = i;
  78. }
  79. }
  80. else // 铁轨i 为空
  81. if (!BestTrack)
  82. BestTrack = i;
  83. if (!BestTrack)
  84. return 0; //没有可用的铁轨
  85. //把车厢c 送入缓冲铁轨
  86. Push(&H[BestTrack],c);
  87. printf("Move car %d from input to holding track %d\n" ,c, BestTrack);
  88. //必要时修改minH 和minS
  89. if (c<*minH) {
  90. *minH = c;
  91. *minS = BestTrack;
  92. }
  93. return 1;
  94. }
  95. void Output(int* minH, int* minS, SeqStack H[ ], int k, int n)
  96. { //把车厢从缓冲铁轨送至出轨处,同时修改m i n S和m i n H
  97. int c,i; // 车厢索引
  98. // 从堆栈m i n S中删除编号最小的车厢minH
  99. c=Pop(&H[*minS]) ;
  100. printf("Move car %d from holding track %d to output\n",*minH,*minS);
  101. // 通过检查所有的栈顶,搜索新的m i n H和m i n S
  102. *minH=n+2;
  103. for (i = 1; i <= k; i++)
  104. if (!IsEmpty(&H[i]) && (c=Top(&H[i])) < *minH) {
  105. *minH = c;
  106. *minS = i;
  107. }
  108. }
  109. int Railroad(int p[], int n, int k)
  110. {// k个缓冲铁轨,车厢初始排序为p [1:n]
  111. // 如果重排成功,返回1,否则返回0
  112. // 如果内存不足,则引发异常NoMem 。
  113. //创建与缓冲铁轨对应的堆栈
  114. SeqStack *H;
  115. int NowOut = 1; //下一次要输出的车厢
  116. int minH =n+1; //缓冲铁轨中编号最小的车厢
  117. int minS,i; //minH号车厢对应的缓冲铁轨
  118. H=(SeqStack*)calloc((k+1),sizeof(SeqStack)*(k+1));
  119. //车厢重排
  120. for (i = 1; i<= n; i++)
  121. if (p[i] == NowOut) {// 直接输出t
  122. printf("移动车厢%d从出口到入口",p[i]);
  123. NowOut++;
  124. //从缓冲铁轨中输出
  125. while (minH == NowOut) {
  126. Output(&minH, &minS, H, k, n);
  127. NowOut++;
  128. }
  129. }
  130. else {// 将p[i] 送入某个缓冲铁轨
  131. if (!Hold(p[i], &minH, &minS, H, k, n))
  132. return 0;
  133. }
  134. return 1;
  135. }
  136. void main(void)
  137. {
  138. int p[8]={2,4,1,6,5,3,8,7};
  139. Railroad(p,8,4);
  140. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124518288

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。