最近在学习二叉树,学习了怎样计算算术表达式
计算算术表达式的大体思路是:
1. 首先是将中缀表达式转换成后缀表达式
2. 将后缀表达式,借助栈就能轻易的求出值
例如:
(1+2)x3的后缀表达式是 12+3x,借助一个栈,将1,2放进去,在发现是+,将1,2弹出,计算1+2,计算出结果(3),放进去,栈中有3,3再遇见‘x’号,将3,3弹出,计算出结果(9),最终计算出结果。
//确定运算符的优先级
HashMap<Character,Integer> map=new HashMap<Character,Integer>();
public void initiall(){
map.put('#', -1);
map.put('+', 0);
map.put('-', 1);
map.put('*', 2);
map.put('/', 3);
}
//设置一个Linkedlist存放后缀表达式
//设置一个Stack存放运算符
private LinkedList<String> linkedlist=new LinkedList<String>();
private Stack<Character> stack=new Stack<Character>();
接下来将算术表达式转换成后缀表达式
public void opeator() throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] char_str=br.readLine().toCharArray();
stack.push('#');
int i=0;
while(i<char_str.length){
if(char_str[i]=='('){
stack.push(char_str[i]);
}
else if(char_str[i]==')'){
Character temp=stack.pop();
while(temp!='('){
linkedlist.add(temp.toString());
temp=stack.pop();
}
}
else if(map.containsKey(char_str[i])){
Character temp=stack.peek();
while(temp!='('&&map.get(temp)>map.get(char_str[i])){
temp=stack.pop();
linkedlist.add(temp.toString());
temp=stack.peek();
}
stack.push(char_str[i]);
}
else{
linkedlist.add(String.valueOf(char_str[i]));
}
i++;
}
}
转换成后缀表达式后,再根据栈求出结果
public int getResult(){
Iterator<String> iterator=linkedlist.iterator();
Stack<Integer> stackInt=new Stack<Integer>();
while(iterator.hasNext()){
String str=iterator.next();
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
int a=stackInt.pop();
int b=stackInt.pop();
int result=0;
if(str.equals("+")){
result=a+b;
}
else if(str.equals("-")){
result=b-a;
}
else if(str.equals("*")){
result=a*b;
}
else if(str.equals("/")){
result=a/b;
}
stackInt.push(result);
}
else{
stackInt.push(Integer.parseInt(str));
}
}
return stackInt.pop();
}
可能没有考虑出错的情况,有点不好。