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