package com.oj;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
String strExpression=scan.next();
scan.close();
System.out.print(calculate(strExpression));
}
private static int calculate(String strExpression)
{
String s=strExpression;
s=s.replace('[', '(');
s=s.replace(']', ')');
s=s.replace('{', '(');
s=s.replace('}', ')');
ArrayList<String> result=getStringList(s);//string转换为list
result=getPostOrder(result);//中缀变后缀
int i=calculate(result);//计算
return i;
}
private static ArrayList<String> getStringList(String str)
{
ArrayList<String> result=new ArrayList<String>();
StringBuilder num=new StringBuilder();
char pre='(';
for(int i=0;i<str.length();i++)
{
char c=str.charAt(i);
if(Character.isDigit(c)||c=='-')
{
if(c=='-'&&Character.isDigit(pre))
{
result.add(num.toString());
num.setLength(0);
result.add(str.charAt(i)+"");
}
else//普通数字或者数字的符号
num.append(c);
}
else
{
if(num.length()!=0)
{
result.add(num.toString());
num.setLength(0);
}
result.add(str.charAt(i)+"");
}
pre=c;
}
if(num.length()!=0)//对最后一个数做处理
{
result.add(num.toString());
num.setLength(0);
}
return result;
}
//比较运算符
public static boolean compare(String peek,String cur)
{
if("*".equals(peek)&&("/".equals(cur)||"*".equals(cur)||"+".equals(cur)||"-".equals(cur)))
return true;
else if("/".equals(peek)&&("/".equals(cur)||"*".equals(cur)||"+".equals(cur)||"-".equals(cur)))
return true;
else if("+".equals(peek)&&("+".equals(cur)||"-".equals(cur)))
return true;
else if("-".equals(peek)&&("+".equals(cur)||"-".equals(cur)))
return true;
return false;
}
//将中缀表达式转为后缀表达式
public static ArrayList<String> getPostOrder(ArrayList<String>inOrderList)
{
ArrayList<String> result=new ArrayList<String>();
Stack<String> stack=new Stack<String>();
for(int i=0;i<inOrderList.size();i++)
{
String s=inOrderList.get(i);
if(Character.isDigit(s.charAt(0))||(s.length()>1&&s.charAt(0)=='-'))
{
result.add(s);
}
else
{
switch(s.charAt(0))
{
case '(':
stack.push(s);break;
case ')':
while(!stack.peek().equals("("))//peek 查看栈顶元素
{
result.add(stack.pop());
}
stack.pop();
break;
default:
while(!stack.isEmpty()&&compare(stack.peek(),s))
{
result.add(stack.pop());
}
stack.push(s);
break;
}
}
}
while(!stack.isEmpty())
{
result.add(stack.pop());
}
return result;
}
//计算后缀表达式
public static Integer calculate(ArrayList<String> postOrder)
{
Stack<Integer> stack=new Stack<>();
for(int i=0;i<postOrder.size();i++)
{
String s=postOrder.get(i);
if(Character.isDigit(s.charAt(0))||(s.length()>1&&s.charAt(0)=='-'))
{
stack.push(Integer.parseInt(postOrder.get(i)));
}
else
{
Integer back=(Integer)stack.pop();
Integer front=(Integer)stack.pop();
Integer res=0;
switch (postOrder.get(i).charAt(0))
{
case '+':
res=front+back;break;
case '-':
res=front-back;break;
case '*':
res=front*back;break;
case '/':
res=front/back;break;
}
stack.push(res);
}
}
return (Integer)stack.pop();
}
}
华为OJ 四则运算-java
最新推荐文章于 2024-01-14 23:05:22 发布