算法训练 表达式计算

Problem:

Hint: 

先将中缀表达式转化为后缀表达式,然后计算后缀表达式的值

AcCode:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class Main{
	//存取运算的优先级
	private static HashMap<Character, Integer> map = null;
	//初始化
	public static void inti() {
		map = new HashMap<Character, Integer>();
		map.put('(',-1);
		map.put('+', 0);
		map.put('-', 0);
		map.put('*', 1);
		map.put('/', 1);
	}
	public static List<Object> getHz(String str) {
		inti();
		List<Object> list = new ArrayList<Object>();//最后返回的后缀表达式
		char[] temp = new char[str.length()];
		int top = 0;//字符数组的长度
		for (int i = 0; i < str.length(); i++) {
			if(str.charAt(i)>='0' && str.charAt(i)<='9') {
				int j;
				for (j = i; j < temp.length; j++) {
					if(!(str.charAt(j)>='0' && str.charAt(j)<='9')) {
						break;
					}
				}
				list.add(str.substring(i, j));
				i = j-1;
			}else if(str.charAt(i)==')') {
				while(top>0) {
					char tempChar = temp[--top];
					if(tempChar=='(') {
						break;
					}
					list.add(tempChar);
				}
			}else if(str.charAt(i)=='('){
				temp[top++] = '(';
			}else {
				if(top==0) {
					temp[top++] = str.charAt(i);
				}else {
					int tempIndex = top - 1;
					char k = temp[tempIndex];//栈顶符号
					char thisChar = str.charAt(i);
					if(map.get(k)>=map.get(thisChar)) {
						top--;
						while(map.get(k)>=map.get(thisChar)) {
							list.add(k);
							if(top-1>=0) {
								k = temp[top-1];
								if(map.get(k)>=map.get(thisChar)) {
									top--;
								}
							}else {
								break;
							}
						}
						temp[top++] = thisChar;
					}else {
						temp[top++] = thisChar;
					}
				}
			}
		}
		//添加剩余的符号
		while(top>0) {
			list.add(temp[--top]);
		}
		return list;
	}
	//计算后缀表达式
	public static int getResult(List<Object> list) {
		int[] nums = new int[list.size()];
		int top = 0;
		for (int i = 0; i < list.size(); i++) {
			if(list.get(i) instanceof String) {
				nums[top++] = Integer.valueOf((String)list.get(i));
			}else if((Character)list.get(i)=='+') {
				int numA = Integer.valueOf(nums[--top]);
				int numB = Integer.valueOf(nums[--top]);
				nums[top++] = numA+numB;
			}else if((Character)list.get(i)=='-') {
				int numA = Integer.valueOf(nums[--top]);
				int numB = Integer.valueOf(nums[--top]);
				nums[top++] = numB-numA;
			}else if((Character)list.get(i)=='*') {
				int numA = Integer.valueOf(nums[--top]);
				int numB = Integer.valueOf(nums[--top]);
				nums[top++] = numA*numB;
			}else if((Character)list.get(i)=='/') {
				int numA = Integer.valueOf(nums[--top]);
				int numB = Integer.valueOf(nums[--top]);
				nums[top++] = numB/numA;
			}
		}
		return nums[0];
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String str = in.next();
		List<Object> list = getHz(str);
		//System.out.println(list);
		System.out.println(getResult(list));
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值