帮朋友解答一道题~输入String的运算公式直接输出结果

package testAndfun;

import java.util.Stack;

public class operator {
	public static void main(String[] args){
		operator opt = new operator();
		System.out.println(opt.caculate("3+5*2/4+3*2-1"));
	}
	private static final String[] prior = {"*/","+-","$"};
	
	private Stack<Character> opStack = new Stack<Character>();
	private Stack<Integer> numStack = new Stack<Integer>();
	
	public int caculate(String str){
		char tmpChar;
		//取正常的数字
		StringBuffer tmpNum = new StringBuffer();
		//取完整的字符串 给丫加一个末尾标记
		StringBuffer buff = new StringBuffer(str+"$");
		
		while(buff.length()!=0){
			tmpChar = buff.charAt(0);
			//先给丫去了
			buff.delete(0, 1);
			if(tmpChar<'0' || tmpChar>'9'){
				//假如不是数字,就可以把之前tmpNum里存的数字连起来了,比如2,6->26然后输出了。
				if(!tmpNum.toString().equals("")){
					int num = Integer.parseInt(tmpNum.toString());
					numStack.push(num);
					tmpNum.delete(0, tmpNum.length());
				}
				while(!compare(tmpChar) && (!opStack.empty())){
					char op = opStack.pop();
					
					Integer a = numStack.pop();
					Integer b = numStack.pop();
					Integer result = 0;
					switch(op){
					case '+':
						result = a+b;
						break;
					case '-':
						result = b-a;
						break;
					case '*':
						result = a*b;
						break;
					case '/':
						if(a==0){
							System.out.println("这种情况没考虑。。看看机器怎么报");
						}
						
						result = b/a;
						break;
					default:
						System.out.println("错误输入,你要是愿意,throw一个exeption便是极好的");
					
					}
					numStack.push(result);
				}
				//最后一个啦
				if(tmpChar!='$')
					opStack.push(tmpChar);
				
			}
			//是一个完整的数,2和6是26
			else{
				tmpNum = tmpNum.append(tmpChar);
			}
			
		}
		return numStack.pop();
	}
	
	//比较现操作符与stack里面的优先级高低
	private boolean compare(char currentChar){
		
        if (opStack.empty())
        {
            return true;
        }
        //不能pop,要不就没了,只能lastElement
        char lastchar = (char) opStack.lastElement();
        
        //用-1假设找不到,好直接return
        int lastPriority = -1;
        int currentPriority = -1;

        for (int i = 0; i < prior.length; i++){
        	//能找到。-1的话就是没找到了。
            if (prior[i].indexOf(lastchar) != -1){
                lastPriority = i;
            }

            if (prior[i].indexOf(currentChar) != -1){
                currentPriority = i;
            }
        }

        return currentPriority < lastPriority;
    }
	

}

题目like this:

 
 
四则运算(10分)
题目内容:
你的程序要读入一个整数四则运算的式子,其中的整数均为非负整数且小于10000,其中的运算符只有加减乘除(+-*/)四种。你的程序要计算这个式子,并输出结果。计算过程必须遵守优先级,即*/要在+-之前先计算。当遇到除法时,按照Java语言的整数除法的方式来计算,即只留下整数的结果。
 
提示:一种可能的做法是,将整个式子作为字符串读入,然后找出其中最后一个+或-,在此位置将其截成两段,分别计算后再做+或-,以此类推。
另,用Integer.parseInt(s)可以从一个字符串得到整数。
 
输入格式:
输入时,所有的成分均没有有空格隔开,即每个运算符前后都没有空格。注意,单个数字也是可能的一种输入。
 
输出格式:
输出结果的整数。
 
输入样例:
2+3*4-6/3
 
输出样例:
12
时间限制:500ms内存限制:32000kb


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值