华为OJ 四则运算-java

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();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值