思路分析
- 结合前三篇文章的内容所得
- 先将中缀表达式转中缀list
- 再将中缀list转后缀list
- 最后计算后缀list
package com.ran;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class Hello {
public static void main(String[] args) {
String biaodashi="1+((2+3)*4)-5";
System.out.println(bianli(biaodashi));
System.out.println(houzhui(bianli(biaodashi)));
String aaa="1 2 3 + 4 * + 5 -";
System.out.println(fenge(aaa));
System.out.println("1+((2+3)*4)-5的中缀表达式运算结果是:"+yunsuan(fenge(aaa)));
}
//遍历
public static List<String> bianli(String biaodashi){
List<String> qq=new ArrayList<String>();
int i=0;
char c;
String str;
do {
if( (c=biaodashi.charAt(i))<48 || (c=biaodashi.charAt(i))>57){
qq.add(""+c);
i++;
}else{
str="";
while (i<biaodashi.length() && (c=biaodashi.charAt(i))>=48 && (c=biaodashi.charAt(i))<=57){
str+=c;
i++;
}
qq.add(str);
}
}while (i<biaodashi.length());
return qq;
}
//转后缀
public static List<String> houzhui(List<String> list){
Stack<String> s1 = new Stack<String>();
List<String> s2=new ArrayList<String>();
for (String qq : list) {
if(qq.matches("\\d+")){
s2.add(qq);
}else if(qq.equals("(")){
s1.push(qq);
}else if(qq.equals(")")){
while (!s1.peek().equals("(")){
s2.add(s1.pop());
}
s1.pop();
}else {
while (s1.size()!=0 && youxianji.dedaoyouxianji(s1.peek())>=youxianji.dedaoyouxianji(qq) ){
s2.add(s1.pop());
}
s1.push(qq);
}
}
while (s1.size()!=0){
s2.add(s1.pop());
}
return s2;
}
//后缀的切割
public static List<String> fenge(String biaodashi){
List<String> qq=new ArrayList<>();
String[] split = biaodashi.split(" ");
for (String qw : split) {
qq.add(qw);
}
return qq;
}
//后缀的计算
public static int yunsuan(List<String> list){
Stack<String> qq = new Stack<>();
for (String www : list) {
if(www.matches("\\d+")){
qq.add(www);
}else {
int res=0;
int num2=Integer.parseInt(qq.pop());
int num1=Integer.parseInt(qq.pop());
if(www.equals("+")){
res=num1+num2;
}
if(www.equals("-")){
res=num1-num2;
}
if(www.equals("*")){
res=num1*num2;
}
if(www.equals("/")){
res=num1/num2;
}
qq.add(""+res);
}
}
return Integer.parseInt(qq.pop());
}
}
class youxianji{
private static int jia=1;
private static int jian=1;
private static int cheng=1;
private static int chu=1;
public static int dedaoyouxianji(String qq){
int res=0;
switch (qq){
case "+":
res=jia;
break;
case "-":
res=jian;
break;
case "*":
res=cheng;
break;
case "/":
res=chu;
break;
default:
System.out.println("不存在该运算符");
break;
}
return res;
}
}
代码运行效果如下: