目录
一、中缀表达式转前缀表达式计算机求值算法介绍
1.将中缀表达式转成前缀表达式,具体算法和代码实现可参考我的博客咸鱼学数据结构与算法——中缀表达式转前缀表达式
2.前缀表达式计算机求值,具体算法和代码实现可参考我的博客咸鱼学数据结构和算法——前缀表达式计算机求值
二、中缀表达式转前缀表达式计算机求值代码实现
public class PolandNotationCalculator {
public static void main(String[] args) {
String InfixExperssion="(3+4)*5-6";
Stack<String> numStack =new Stack<String>();
System.out.println("中缀表达式为:"+InfixExperssion);
List<String> PrefixExperssion=InfixToPrefix(InfixExperssion);
System.out.println("前缀表达式为:"+PrefixExperssion);
PrefixCalculate(PrefixExperssion,numStack);
System.out.println("最后的结果为:"+numStack.pop());
}
// 中缀表达式转前缀表达式
public static List<String> InfixToPrefix(String infixExperssion){
// 从右向左扫描
int index=infixExperssion.length()-1;
// 用来存放前缀表达式
List<String> resultList=new ArrayList<String>();
// 用来存放运算符
Stack<String> operStack=new Stack<String>();
// 用来拼接数字,多位数字
String joint="";
while (true){
// 当扫描完毕后,退出循环
if(index<0){
break;
}
// 如果扫描到是操作数,直接将结果加入到结果list中
// 如果是多位数的问题已经解决
if (isNum(infixExperssion.charAt(index))){
// 由于是从右向左扫描,所以拼接要从右侧开始拼接
joint=infixExperssion.charAt(index)+joint;
// 判断是否越界,如果越界则不需要比较
if(index>1){
// 判断下一个字符是否为数字
if(!isNum(infixExperssion.charAt(index-1))){
resultList.add(joint);
joint="";
// 执行完成后让index加一,不然会陷入死循环
index--;
}else {
index--;
}
// 已经是最后一位数了,不需要看下一位了
}else {
resultList.add(joint);
joint="";
index--;
}
// 如果是运算符,根据运算符优先级判断运算符是否进入运算符栈
}else if(isOper(infixExperssion.charAt(index))){
char oper=infixExperssion.charAt(index);
// 如果为空,则直接加入到运算符中
if (operStack.empty()){
operStack.push(String.valueOf(oper));
index--;
// 如果优先级大于运算符栈顶运算符的优先级,将运算符加入到运算符栈中
}else if(Priority(oper)>Priority(operStack.peek().charAt(0))){
operStack.push(String.valueOf(oper));
index--;
// 将运算符栈栈顶的运算符加入到List数组中
}else {
resultList.add(operStack.pop());
// index++;
}
// 如果是右括号,将右括号放入运算符栈中
}else if(infixExperssion.charAt(index)==')'){
operStack.push(String.valueOf(infixExperssion.charAt(index)));
index--;
// 根据右括号来去除左括号
} else if(infixExperssion.charAt(index)=='('){
while (!operStack.empty()&&!operStack.peek().equals(")")){
resultList.add(operStack.pop());
}
// 丢弃右括号
operStack.pop();
index--;
}
}
// 将运算符栈中的运算符弹到list中
while (!operStack.empty()){
resultList.add(operStack.pop());
}
// 将结果反转
Collections.reverse(resultList);
return resultList;
}
public static int Priority(char ch){
if (ch=='+'||ch=='-'){
return 1;
}else if (ch=='*'||ch=='/'){
return 2;
}else {
return 0;
}
}
public static void PrefixCalculate(List<String> PrefixExperssion, Stack<String> numStack){
// 从右向左扫描
for (int i=PrefixExperssion.size()-1;i>=0;i--){
System.out.println(PrefixExperssion.get(i));
if (isNum(PrefixExperssion.get(i))){
// System.out.println("测试入栈数据"+PrefixExperssionSplit[i]);
numStack.push(PrefixExperssion.get(i));
}else {
// 栈顶数字
int num1=Integer.valueOf(numStack.pop());
// 次栈顶数字
int num2=Integer.valueOf(numStack.pop());
String opr=PrefixExperssion.get(i);
int res=Calculate(num2,num1,opr);
numStack.push(String.valueOf(res));
}
}
}
public static boolean isOper(char oper){
if(oper=='+'||oper=='-'||oper=='*'||oper=='/'){
return true;
}else {
return false;
}
}
public static boolean isNum(char num){
if(num>=48&&num<=57){
return true;
}else {
return false;
}
}
public static boolean isNum(String str){
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return false;
}else {
return true;
}
}
public static int Calculate(int num1,int num2,String opr){
int res=0;
switch (opr){
case "+":
res=num1+num2;
break;
case "-":
res=num2-num1;
break;
case "*":
res=num1*num2;
break;
case "/":
res=num2/num1;
break;
default:
break;
}
return res;
}
}