【问题标题】:Create stack to convert from infix to postfix using arrays创建堆栈以使用数组从中缀转换为后缀
【发布时间】:2020-02-05 17:24:12
【问题描述】:

我目前正在尝试在不导入 java.util.* 的情况下创建自己的堆栈。我只被允许使用数组和循环将我的中缀表达式转换为后缀,以便它在计算器中工作。我已经可以将中缀拆分为术语,但找不到任何解释如何解决此问题的文章。 提前谢谢!

【问题讨论】:

  • 您能进一步描述您的问题吗?也许添加一些代码或伪代码来解释你的想法?
  • 你试过什么?一般的想法是创建一个数组并在任何堆栈操作之后跟踪堆栈的顶部,如果需要,可能会“增长”堆栈的数组。
  • 实际上这听起来像是一次有两个问题。首先你需要用一个简单的数组创建你的“堆栈”。例如,您可以创建一个带有数组的类StackArray 来支持您的元素。然后,您需要 Stack 通常具有的方法(push、pop、peek...)。一旦你有了你的堆栈实现,你就可以分析你的中缀后缀问题。我的建议:在纸上做。一旦你拆分了你的表达式(读作“中缀”),你需要以正确的顺序将“术语”添加到你的堆栈中。如果你有arr=['a', '+', 'b'] 你有:stack.put(arr[0]); stack.put(arr[2]);stack.put(arr[1]);
  • 问题是我理解了调车场算法的原理,但是我不知道如何将它实现到我的代码中。现在我创建了一个包含 public boolean isEmpty()、public String pop() 和 public String push() 的新类,我将用它来替换堆栈函数
  • 不确定,可能是Shunting-yard algorithm 或那里链接的一些算法(巧合的是我上周尝试过,但肯定使用过java.util

标签: java arrays stack


【解决方案1】:

here 是对算法的一个很好的描述(wikipedia/en)。

基本上,您首先要拆分表达式。例如

a + b * c

如果它是一个字符串,那么你这样做:

String expression = "a + b * c";
String[] terms = expression.split(" ");  // this will split the string at every whitespace

现在你的数组应该是这样的:["a", "+", "b", "*", "c"]

您现在需要一个数组,您可以在其中将“术语”放入后缀顺序:

String[] postFixTerms = new String[expression.length]; // it should have the same size as the original array

所以要填充它,您从左到右读取您的terms 数组,这意味着您从索引 0 开始并在 n 结束。 但是您想过滤掉操作数并将它们放入您的堆栈中!

int termsIndex=0;  // you will have two indices because you have two arrays!
for(int i=0; i<terms.length; i++){
   String element = terms[i];
   if(elementIsOperand(element)){
      operandsStack.put(element);
   }else{
      postFixTerms[termsIndex] = element; 
      termsIndex++;
   }
}

此时您应该有一个包含“数字”的数组:

postFixTerms=["a", "b", "c", null, null]; // remember you only added the numbers in it not the operands, so there is still some space left at the end of the array

你有你的操作数堆栈:

operandsStack=["+","*"];

现在您只需要将它们放在一起,但请记住堆栈的工作方式是“FILA”——先进后出,所以:

postFixTerms[termsIndex] = operandsStack.pull();  // adds "*" first
termsIndex++;
postFixTerms[termsIndex] = operandsStack.pull();  // then adds the "+"

如果一切顺利,你的最终后缀表达式应该是

["a","b","c","*","+"];

【讨论】:

  • 顺便说一句:方法“elementIsOperand”需要你自己实现;)
猜你喜欢
  • 2015-09-12
  • 2015-09-13
  • 2013-11-08
  • 2013-03-28
  • 2012-09-22
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多