蓝桥杯-JAVAC组-表达式计算

问题描述

输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

输入一行,包含一个表达式。

输出格式

输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

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

import java.awt.Shape;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class 表达式运算 {

	/**
	 * @param args
	 */
	//中缀表达式转后缀表达式所用的栈
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scanner = new Scanner(System.in);
		String string = scanner.next();
		//1+((23+34)*5)-6
		ArrayList<Character> stack1 = new ArrayList<Character>();
		ArrayList<Character> stack2 = new ArrayList<Character>();
		//转后缀
		for (int i = 0; i <string.length(); i++) {	
			char s = string.charAt(i);
			char ss = 0;
			if (s>='0'&&s<='9') {
				stack1.add(s);	
				if (i==string.length()-1) {	
				ss = string.charAt(i);
				}else {
					ss=string.charAt(i+1);
				}
				if (ss>='0'&&ss<='9') {
					continue;
				}else {
					stack1.add('#');
				}
			}else {
				if (s==')') {
					//那么就进行消运算符,加到数字里面去
					for (int j = stack2.size()-1; j>=0; j--) {
						if (stack2.get(j)=='('){
							//移除stack2中的括号中间的元素包括括号
							for (int j2 = stack2.size()-1; j2>=j; j2--) {
								stack2.remove(j2);								
							}
							break;
						}else {
							//括号中间的符号加入到stack1中
							stack1.add(stack2.get(j));
							stack1.add('#');
						}
					}
				}else{
					char sss=0;
					if (stack2.size()>0) {
						sss = stack2.get(stack2.size()-1);
						if (panduan(s,sss)) {
							//判断符号运算及
							stack1.add(sss);
							stack1.add('#');
							stack2.remove(stack2.size()-1);
							stack2.add(s);
						}else {
							stack2.add(s);
						}
					}else {
						stack2.add(s);
					}    
				}
			}
		}		
		//1 # 2 3 # 3 4 # + 5 # * + 6 # -
		//处理stack2中剩余字符
		for (int j = stack2.size()-1; j >=0; j--) {
			if (stack1.get(stack1.size()-1)=='#') {
				stack1.add(stack2.get(j));
			}else {
				stack1.add('#');
				stack1.add(stack2.get(j));
			}	
		}
		//进行算数处理
		//储存数字
		ArrayList<Double> list = new ArrayList<Double>();
		//储存字符串
		String chuli = "";
		//把stack1数组转为字符串
		for (int j = 0; j <stack1.size(); j++) {
			chuli+=stack1.get(j);
		}
		//以#分隔
		String str[]=chuli.split("#");
		for (int i = 0; i < str.length; i++) {
			//计算
			if (str[i].equals("+")||str[i].equals("-")||str[i].equals("/")||str[i].equals("*")) {
				//取出后两个数
				Double num1 = list.get(list.size()-1);
				Double num2 = list.get(list.size()-2);
				if (str[i].equals("+")) {
					list.set(list.size()-2, num2+num1);
					list.remove(list.size()-1);
				}else if (str[i].equals("-")) {
					list.set(list.size()-2, num2-num1);
					list.remove(list.size()-1);
				}else if (str[i].equals("*")) {
					list.set(list.size()-2, num2*num1);
					list.remove(list.size()-1);
				}else if (str[i].equals("/")) {
					list.set(list.size()-2, num2/num1);
					list.remove(list.size()-1);
				}
			}else {
				list.add(Double.parseDouble(str[i]));  //如果为数字就存到数组中间去
			}
		}
		//算到最后只剩下最后一个数字了,那就是答案,直接输出
		System.out.println(list.get(0));
	}	
	//判断符号优先级
	public static boolean panduan(char a,char b){
		if ((a=='+'&&b=='-')
			||(a=='*'&&b=='/')
			||(a=='-'&&b=='+') 
			||(a=='/'&&b=='*')){
			return true;
		}else if((a=='+'&&(b=='*'||b=='/'))
			||(a=='-'&&(b=='*'||b=='/'))){
			return true;
		}
		return false;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值