【问题标题】:Show top and bottom alternately in a stack在堆栈中交替显示顶部和底部
【发布时间】:2021-05-20 17:51:24
【问题描述】:

我正在做这个练习,我必须交替显示堆栈顶部的元素,然后显示堆栈底部的元素,直到它为空。我仍然发现很难利用递归来解决这些练习,我想知道是否有人可以帮助我。我不能使用循环,只能使用递归。 这是说明: “给定 stack_t 抽象数据类型及其定义的操作:create、top、push、pop、elements(返回栈中元素的数量)、destroy: 完成 one_and_one 函数,该函数接收一个堆栈并从顶部元素开始交替显示堆栈中的项目,然后是底部元素,直到堆栈为空”。 这是我想出的:

void one_and_one(stack_t* stack){

  if(!stack || elements(stack) == 0) return;

  int aux = top(stack);
  pop(stack);
  one_and_one(stack);
  printf("%i\n", aux);
}

在打印底部之前,我仍然需要弄清楚如何打印顶部。 我将举一个例子,以便更好地理解。如果我有以下堆栈(1 是顶部元素): | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | 输出必须如下:1,7,2,6,3,5,4。 无论如何,谢谢!

【问题讨论】:

  • 我不确定这是否可能。因为如果你想访问堆栈的底部元素,堆栈应该是空的。

标签: c recursion stack


【解决方案1】:

如果操作可能是破坏性的——即原始堆栈预计不会保持不变,那么这里有一个算法思路:

  1. 显示栈顶
  2. 创建另一个堆栈
  3. 现在从原始堆栈中弹出所有元素并将它们推入新堆栈 - 除了您已经显示的顶部 - 这将使新堆栈以相反的顺序包含元素
  4. 在新堆栈上递归调用函数

这是一个伪代码:

function one_and_one(stack)
    if empty(stack)
        return
    print (pop(stack))        // Step 1
    stack2 = create_stack()   // Step 2
    copy_stack(stack2, stack) // Step 3
    destroy_stack(stack)      // Cleanup
    one_end_one(stack2)       // Step 4


/* This is a helper function for step 3 - recursive as well because no loops allowed*/
function copy_stack(dest, src)
   if not empty(src)
      push(dest, pop(src))

附:我觉得把它想象成一个玩具堆叠金字塔很方便,你被要求交替取顶部和底部。你拿另一个“空”金字塔。取第一个金字塔的顶部,然后将这些部分一个接一个地移动到另一个。重复第二个金字塔。这也暗示您可以只使用两个堆栈而不是每次都创建一个。

【讨论】:

  • 是的!到函数结束时,堆栈必须为空。对不起,我将举一个例子,以便更好地理解。如果我有以下堆栈:| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 |输出必须如下:1,7,2,6,3,5,4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2012-07-30
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多