- 将字符串转换成list集合:s=“1+((2+3)×4)-5”=》ArrayList [1,+,(,(,2,+,3,),*,4,),-,5]
- 从集合中取出变成逆序数形式:ArrayList [1,+,(,(,2,+,3,),,4,),-,5] =》 ArrayList [1,2,3,+,4,,+,5,–]
- 计算
package com.hhit.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
String expression="1+((2+3)*4)-5";
List<String> infixExpressionList = toInfixExpressionList(expression);
System.out.println(infixExpressionList);
List<String> suffixExpreesionList = parseSuffixExpreesionList(infixExpressionList);
System.out.println(suffixExpreesionList);
int result=calculate(suffixExpreesionList);
System.out.println(result);
}
private static List<String> parseSuffixExpreesionList(List<String> infixExpressionList) {
Stack<String> s1 = new Stack<String>();
List<String> s2 = new ArrayList<String>();
for (String item:infixExpressionList){
if (item.matches("\\d+")){
s2.add(item);
}else if (item.equals("(")){
s1.push(item);
}else if (item.equals(")")){
while (!s1.peek().equals("(")){
s2.add(s1.pop());
}
s1.pop();
}else {
while (s1.size()>0&&Operation.getValue(item)<=Operation.getValue(s1.peek())){
s2.add(s1.pop());
}
s1.push(item);
}
}
while (s1.size()>0){
s2.add(s1.pop());
}
return s2;
}
public static List<String> toInfixExpressionList(String expression){
List<String> list=new ArrayList<String>();
int i=0;
char c;
String s="";
do {
if ((c=expression.charAt(i))<48||(c=expression.charAt(i))>57){
list.add(c+"");
i++;
}else {
while(i<expression.length()&&(c=expression.charAt(i))>=48&&(c=expression.charAt(i))<=57){
s+=c;
i++;
}
list.add(s);
s="";
}
}while (i<expression.length());
return list;
}
public static int calculate(List<String> ls){
Stack<String> stack=new Stack<String>();
for (String item:ls){
if(item.matches("\\d+")){
stack.push(item);
}else {
int num2=Integer.parseInt(stack.pop());
int num1=Integer.parseInt(stack.pop());
int res=0;
if (item.equals("+")){
res=num1+num2;
}else if (item.equals("-")){
res=num1-num2;
}else if (item.equals("*")){
res=num1*num2;
}else if (item.equals("/")){
res=num1/num2;
}else {
throw new RuntimeException("运算符有误");
}
stack.push(""+res);
}
}
return Integer.parseInt(stack.pop());
}
}
class Operation {
private static int ADD = 1;
private static int SUB = 1;
private static int MUL = 2;
private static int DIV = 2;
public static int getValue(String operation) {
int result = 0;
switch (operation) {
case "+":
result = ADD;
break;
case "-":
result = SUB;
break;
case "*":
result = MUL;
break;
case "/":
result = DIV;
break;
default:
System.out.println("不存在该运算符" + operation);
break;
}
return result;
}
}