【问题标题】:How to create a dynamic array of dynamic stacks in C or C++如何在 C 或 C++ 中创建动态堆栈的动态数组
【发布时间】:2014-12-14 08:14:39
【问题描述】:

这是我的 C 类编程作业:

有一列火车驶入您的航站楼。 Train 有 N 个货物,货物标记为从 1 到 N。您必须按照从 N 到 1 的顺序将货物送出码头(如 6 5 4 3 2 1)。 1 5 3 4 2 是一个有 5 个货物的进站火车的例子。

您的终端有许多导轨。这是带有 5 条导轨的终端的样子:

您的终端只允许进行 3 次操作:

  1. 将您收到的货物送出码头。
  2. 将您收到的货物送到终点站轨道。
  3. 将货物从铁路运出码头。

例子:来车是1 2 3

INPUT :您必须接收作为火车货物的输入,例如1 2 3。输入列车的货物不超过 100 个。

OUTPUT : 显示尽可能少的rails来完成这个过程,在上图中,输出应该是1

我认为我的 (psudo) 代码应该类似于:

for(int i = 1; i <= cargoAmount;)
{
      if(i == trainin.top()) //found in IN: send the cargo out
      {
         trainin.pop(); 
         i++;
         continue; 
      }
      for(j = 0; j <= TotalStackCurrentlyInUse??; j++) //found in a RAIL: send the cargo out
      {
         if(i == rail[j].top())
         {
            rail[j].pop();
            i++;
            break; 
         }
      }
      if(j == TotalStackCurrentlyInUse) //Not found: Send the train to the rail stack
           SendTheTrainToTheRail(); 
           // I will try to write this thing later
           // I have the idea that the new cargo should have the value lass than rail[j].top()
 }

现在我认为我应该在我的 C 应用程序中使用许多动态堆栈(每个堆栈代表终端中的每个轨道)并且我应该跟踪程序使用的堆栈数量。我的朋友告诉我,我应该忘记整个堆栈的事情,只需使用链表先创建 100 个rail[j].head,然后它就会变得容易。但我只是想知道如何使用堆栈来实现(如果 C 语言既难又乱,我可以使用 C++ 堆栈和向量)。

问题:如何在 C 或 C++ 中创建动态堆栈的动态数组以及如何跟踪当前使用的堆栈数量。(请注意,我对 C++ 很陌生,所以这个问题可能看起来很愚蠢)

【问题讨论】:

  • 为什么一个堆在这里不能满足您的目的...铁路可以存储的最大货物数量吗???
  • 你好像只需要一根铁轨,只要它可以容纳 99 节车厢,还是有些火车到达时的车厢顺序混乱?
  • 列车长度限制为 100,应该可以只使用静态或自动分配,最坏的情况是 99 轨 (99,98...2,1,100),需要的最长轨是 99 . (1,2,...,99,100)
  • @Jasen 这不会太消耗内存吗?它将花费 99*99 整数(或者可能是 99*99 短裤)。
  • 没有“C/C++”之类的东西。有 C,也有 C++。我从未见过任何标有“C/C++”的好东西。如果你想知道如何用 C++ 编写代码,你需要学习专门用 C++ 编写代码,而不是将 C++ 视为 C 之上的一些不错的可选附加功能。

标签: c++ c arrays jagged-arrays


【解决方案1】:

您可以简单地创建一个std::vector&lt;std::stack&gt; 并循环它。您的代码已修改:

  vector<stack> railStacks;//This should be accessible and appended to by `SendTheTrainToTheRail()`
  for(j = 0; j < railStacks.size() ; j++) //found in a RAIL: send the cargo out
  {
     if(i == railStacks[j].top())
     {
        railStacks[j].pop();
        i++;
        break; 
     }
  }
  if(j == railStacks.size()) //Not found: Send the train to the rail stack
       SendTheTrainToTheRail();

【讨论】:

  • 在堆栈为空时调用railStacks[j].top() 会发生什么?它会返回 0 还是会狂奔?
  • 你是对的,在这种情况下是UB。调用pop 后,如果堆栈为空,则应从railStacks 中擦除堆栈。此外,j==railStacks.size() 不再是安全检查。您可能只想使用该信息维护bool
  • 所以我应该创建另一个向量,其中每个元素代表每个堆栈的有效性?
  • 使用empty成员函数。
猜你喜欢
  • 2020-10-11
  • 2019-02-02
  • 2023-01-11
  • 1970-01-01
  • 2013-02-11
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多