逆波兰表达式的计算:
输入一个逆波兰表达式,每个数字运算符之间用空格间隔。
import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Text1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
reversrPolish(str);
}
public static void reversrPolish(String str) {
Stack s=new Stack();
String []s1=str.split(" ");
Pattern p=Pattern.compile("\\d+");
for(int i=0;i<s1.length;i++) {
Matcher m=p.matcher(s1[i]);
if(m.matches()) {
s.push(s1[i]);
}
else if(s1[i].equals("+")&& !s.isEmpty()){
Double a=Double.valueOf((String) s.pop());
Double b=Double.valueOf((String) s.pop());
Double c=a+b;
s.push(c.toString());
}
else if(s1[i].equals("*")&& !s.isEmpty()){
Double a=Double.valueOf((String) s.pop());
Double b=Double.valueOf((String) s.pop());
Double c=a*b;
s.push(c.toString());
}
else if(s1[i].equals("-")&& !s.isEmpty()){
Double a=Double.valueOf((String) s.pop());
Double b=Double.valueOf((String) s.pop());
Double c=b-a;
s.push(c.toString());
}
else if(s1[i].equals("/")&&!s.isEmpty()) {
Double a=Double.valueOf((String) s.pop());
Double b=Double.valueOf((String) s.pop());
Double c=b/a;
s.push(c.toString());
}
}
System.out.println(s.pop());
}
}
中缀表达式转换为后缀表达式:
输入中缀表达式 ,每个数字和运算符之间用空格间隔:
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Change {
public static void main(String[] args) {
//Stack s=new Stack();
Scanner scanner =new Scanner(System.in);
String str;
str=scanner.nextLine();
Convertor(str);
}
public static void Convertor(String str) {
Stack s=new Stack();
String []s1=str.split(" ");
Pattern p=Pattern.compile("\\d+");
Matcher m;
for(int i=0;i<s1.length;i++) {
m=p.matcher(s1[i]);
if(m.matches()) {
System.out.println(s1[i]);
}
else if(!s1[i].equals(")"))
s.push(s1[i]);
else if(s1[i].equals(")")) {
while(!s.peek().equals("(")) {
System.out.println(s.pop());
}
s.pop();
}
}
System.out.print(s.pop());
}
}