package com.cubemonkey.stack;
/**
* @author CubeMonkey
* @create 2020-06-05 13:52
*/
public class PolandNotation {
/**
* 计算指定运算符
* @param num1 被操作数
* @param num2 操作数
* @param oper 运算符
* @return
*/
public static int calc(int num1, int num2, char oper){
int num = 0;
switch (oper){
case '+':
num = num1 + num2;
break;
case '-':
num = num1 - num2;
break;
case '*':
num = num1 * num2;
break;
case '/':
num = num1 / num2;
break;
default:
throw new RuntimeException("oper Error");
}
return num;
}
public static int calculateInfixExpression(String infix){
String suffixExpression = parseSuffixExpression(infix);
return calculate(suffixExpression);
}
/**
* 将中缀表达式转化为后缀表达式
* @param infixExpression
* @return
*/
public static String parseSuffixExpression(String infixExpression){
StringBuffer suffixExpression = new StringBuffer();
LinkedStack<Character> operateStack = new LinkedStack<>();
int index = 0;
int length = infixExpression.length();
char ch;
while(index < length){
ch = infixExpression.charAt(index);
if(ch >= '0' && ch <= '9'){
int num = ch - '0';
while(index + 1 < length && infixExpression.charAt(index+1) >= '0' && infixExpression.charAt(index+1) <= '9'){
num = num*10 + infixExpression.charAt(++index)-'0';
}
suffixExpression.append(num + " ");
}else{
switch (ch){
case '+':
case '-':
while(!operateStack.isEmpty() && operateStack.peek() != '(' && (operateStack.peek() == '-' || operateStack.peek() == '+')){
char operate = operateStack.pop();
suffixExpression.append(operate + " ");
}
operateStack.push(ch);
break;
case '*':
case '/':
while(!operateStack.isEmpty() && operateStack.peek() != '('){
char operate = operateStack.pop();
suffixExpression.append(operate+" ");
}
operateStack.push(ch);
break;
case '(':
operateStack.push(ch);
break;
case ')':
while(!operateStack.isEmpty() && operateStack.peek() != '('){
char operate = operateStack.pop();
suffixExpression.append(operate + " ");
}
operateStack.pop();
break;
default:
break;
}
}
index++;
}
while(operateStack.getLength() > 1){
suffixExpression.append(operateStack.pop() + " ");
}
suffixExpression.append(operateStack.pop());
return suffixExpression.toString();
}
/**
* 逆波兰计算器
* @param suffixExpression
* @return
*/
public static int calculate(String suffixExpression){
int index = 0;
int length = suffixExpression.length();
LinkedStack<Integer> stack = new LinkedStack<>();
char ch;
while(index < length){
ch = suffixExpression.charAt(index);
if(ch >= '0' && ch <= '9'){
int num = ch - '0';
while(index+1 < length && suffixExpression.charAt(index+1) >= '0' && suffixExpression.charAt(index+1) <= '0'){
num = num*10 + suffixExpression.charAt(++index)-'0';
}
stack.push(num);
}else if(ch == '+' || ch == '-' || ch == '*' || ch == '/'){
int num2 = stack.pop();
int num1 = stack.pop();
int res = calc(num1, num2, ch);
stack.push(res);
}
index++;
}
return stack.pop();
}
}
数据结构-逆波兰计算器
最新推荐文章于 2024-09-14 15:47:59 发布