package com.mine.algorithm.algoritem_data_structures._002;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 逆波兰式的四则运算,【设计混乱,代码不整洁,应放慢代码速度】
* @author Administrator
*
*/
public class PolishReverseAlgorithm {
//定义priority
static Map<Character,Integer> priorityMap = new HashMap<>(4);
static{
priorityMap.put('+', 0);
priorityMap.put('-', 0);
priorityMap.put('*', 1);
priorityMap.put('/', 2);
}
static boolean hasHigherPriority(Character a,Character b){
if(!priorityMap.containsKey(a) || !priorityMap.containsKey(b) || b ==null){
return true;
}
return priorityMap.get(a) - priorityMap.get(b)>0;
}
public static Integer calculate(List<Object> list){
Stack<Integer> s = new Stack<>();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if(o instanceof Integer){
s.push(Integer.parseInt(o.toString()));
}else{
char c = o.toString().charAt(0);
int b = s.pop();
int a =s.pop();
switch (c) {
case '+':
s.push(a+b);
break;
case '-':
s.push(a-b);
break;
case '*':
s.push(a*b);
break;
case '/':
s.push(a/b);
break;
default:
break;
}
}
}
return s.pop();
}
public static List<Object> parseString(String calculateString){
List<Object> list = new ArrayList<>();
Stack<Character> fhStack = new Stack<Character>();
List<Integer> numberStack = new LinkedList<Integer>();
String numberString = "";
for (int i = 0; i < calculateString.length(); i++) {
char c = calculateString.charAt(i);
if(c>='0' && c<'9'){
numberString += c;
}else{
if(numberString.length()>0){
numberStack.add(Integer.parseInt(numberString));
}
numberString = "";
//如果是括号,数字栈清空,符号栈出栈直到碰到右括号
Character first = fhStack.getFirstValue();
if(c ==')'){
while(!numberStack.isEmpty()){
list.add(numberStack.remove(0));
}
Character popC;
while((popC=fhStack.pop())!='('){
list.add(popC);
}
// fhStack.pop();
}else if(!hasHigherPriority(c,first)){
///如果不大于上一个元素的优先级,则出栈。
//数字栈清空,符号栈出栈一个
while(!numberStack.isEmpty()){
list.add(numberStack.remove(0));
}
list.add(fhStack.pop());
fhStack.push(c);
}else{
fhStack.push(c);
}
}
// System.out.println("############"+c+"###########");
// fhStack.print();
// numberStack.print();
// System.out.println(list);
// System.out.println("#######################");
}
if(numberString.length()>0){
numberStack.add(Integer.parseInt(numberString));
}
while(!numberStack.isEmpty()){
list.add(numberStack.remove(0));
}
while(!fhStack.isEmpty()){
list.add(fhStack.pop());
}
return list;
}
public static void main(String[] args) {
final String str="1+2*3+4/(1+1)*5";
List<Object> parseString = parseString(str);
System.out.println(parseString);
Integer calculate = calculate(parseString);
System.out.println(calculate);
}
}