蓝桥杯试题集ALGO-156(表达式计算)

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。


思路:根据中缀表达式求后缀表达式,然后利用后缀表达式求值。



import java.util.Collections;
import java.util.Scanner;
import java.util.Stack;


public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		System.out.println(cal(str));
	}

	private static int cal(String str) {
		Stack<String> postFixStack = getPostFixStack(str);
		Stack<Integer> res = new Stack<Integer>();
		Collections.reverse(postFixStack);
		while(!postFixStack.isEmpty()){
			String s = postFixStack.pop();
			if(!isOperate(s.charAt(0))){
				res.push(Integer.parseInt(s));
			}else{
				int a = res.pop();
				int b = res.pop();
				res.push(operate(b,s,a));
			}
		}
		return res.pop();
	}

	private static Integer operate(int a, String s, int b) {
		if("+".equals(s)){
			return a+b;
		}else if("-".equals(s)){
			return a-b;
		}else if("*".equals(s)){
			return a*b;
		}else{
			return a/b;
		}
	}

	private static Stack<String> getPostFixStack(String str) {
		Stack<String> ch = new Stack<String>();
		Stack<String> stack = new Stack<String>();
		String number = "";
		for(int i=0;i<str.length();i++){
			char c = str.charAt(i);
			if(c>='0'&&c<='9'){
				number+=c;
				continue;
			}
			if(!number.equals("")){
				stack.push(number);
				number = "";
			}
			if(c=='('){
				ch.push(c+"");
			}else if(isOperate(c)){
				while(!ch.isEmpty()){
					String s = ch.pop();
					if(isAbove(c+"",s)){
						ch.push(s);
						break;
					}else{
						stack.push(s);
					}
				}
				ch.push(c+"");
			}else if(c==')'){
				while(!ch.isEmpty()){
					String s = ch.pop();
					if(!"(".equals(s)){
						stack.push(s);
					}else{
						break;
					}
				}
			}
		}
		
		while(!ch.isEmpty()){
			stack.push(ch.pop());
		}
		return stack;
	}

	private static boolean isAbove(String op1, String op2) {
		// TODO Auto-generated method stub
		if("(".equals(op2))
			return true;
		else if(("*".equals(op1)||"/".equals(op1))&&("+".equals(op2)||"-".equals(op2)))
			return true;
		return false;
	}

	private static boolean isOperate(char c) {
		// TODO Auto-generated method stub
		return c=='+'||c=='-'||c=='*'||c=='/';
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值