在Java中使用堆栈进行长减法的(递归或非递归)算法的例子是什么?

时间:2015-01-11 07:28:31

标签: java algorithm recursion stack

之前我问过这个问题,但问的方式比较复杂,我想也许我不清楚。

想象一下,我有两个整数堆栈,每个整数代表一个整数,从String解析。每个中的第一个是1的位置,第二个是10个位置,第三个是100个位置等等。我无法绕过这个因为我觉得我需要递归地执行它并且递归算法让我很困惑,尤其是在这种情况下。我感谢任何帮助。

int difference, z;
for (i = 0; i < length; i++)
{
  x = firstNum.pop();
  y = secondNum.pop();
  difference = x - y;
  if (difference < 0)
  {
    z = firstNum.pop();
    firstNum.push(z - 1);
    firstNum.push(x + 10);
  }
  else
  {
    result.push(difference);
  }
}

1 个答案:

答案 0 :(得分:1)

您不需要递归但是您有错误。

int difference, z;
while (!firstNum.isEmpty ())
{
  x = firstNum.pop();
  y = 0;
  if (!secondNum.isEmpty ()) // account for the case when secondNum has less digits
    y = secondNum.pop();
  difference = x - y;
  if (difference < 0)
  {
    z = firstNum.pop();
    firstNum.push(z - 1);
    result.push(difference + 10); // fixed this line, since you want to push the
                                  // difference to the result
  }
  else
  {
    result.push(difference);
  }
}

现在,您应该注意result堆栈中的数字将按相反的顺序排列。在减法结束时,最重要的数字将位于堆栈的顶部。

这是一个带有硬编码样本输入的完整方法:

  public static void subtract ()
  {
    Stack<Integer> firstNum = new Stack<Integer>();
    Stack<Integer> secondNum = new Stack<Integer>();
    Stack<Integer> result = new Stack<Integer>();

    // firstNum == 3002
    firstNum.push (3);
    firstNum.push (0);
    firstNum.push (0);
    firstNum.push (2);

    // secondNum == 129
    secondNum.push (1);
    secondNum.push (2);
    secondNum.push (9);

    int difference, z;
    while (!firstNum.isEmpty ())
    {
      int x = firstNum.pop();
      int y = 0;
      if (!secondNum.isEmpty ())
        y = secondNum.pop();
      difference = x - y;
      if (difference < 0)
      {
        z = firstNum.pop();
        firstNum.push(z - 1);
        result.push(difference + 10);
      }
      else
      {
        result.push(difference);
      }
    }
    while (!result.isEmpty ())
      System.out.print (result.pop ());
    System.out.println ();
  }

输出

2873

请注意,此方法假定第一个数字高于第二个数字。对于第一个数字较小的情况,应该添加一些处理。