创建堆栈以使用数组从中缀转换为后缀

时间:2019-10-08 12:10:08

标签: java arrays stack

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

1 个答案:

答案 0 :(得分:0)

here是对该算法的很好描述(Wikipedia / zh)。

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

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","*","+"];