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