算术表达式计算(栈的应用)
问题描述
给定一个算术表达式字符串(如”12+(-23*3-56+7)*(2+90)/2”),计算表达式的结果。
假设:给定的字符串是合法的表达式,操作数都为整数。
思路:1、首先将中序表达式转换成后序表达式。2、利用栈计算表达式。
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
/** 将字符串转化成List */
public static ArrayList<String> getStringList(String str){
ArrayList<String> result = new ArrayList<String>();
StringBuilder num =new StringBuilder();
char pre='(';
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(Character.isDigit(c)||c=='-'){
if(c=='-'&&Character.isDigit(pre)){
//当前为“-”且前面为数字,为运算符
result.add(num.toString());
num.setLength(0);
result.add(str.charAt(i) + "");
}else{//普通数字或者数字的符号
num.append(c);
}
}else{
if(num.length()!=0){
result.add(num.toString());
num.setLength(0);
}
result.add(str.charAt(i) + "");
}
pre=c;
}
if(num.length() != 0){//对最后一个数做处理
result.add(num.toString());
num.setLength(0);
}
return result;
}
/**比较运算符等级 */
public static boolean compare(String peek, String cur){
if("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){
return true;
}else if("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){
return true;
}else if("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))){
return true;
}else if("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))){
return true;
}
return false;
}
/** 将中缀表达式转化为后缀表达式 */
public static ArrayList<String> getPostOrder(ArrayList<String> inOrderList){
ArrayList<String> result = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
for (int i = 0; i < inOrderList.size(); i++) {
String s=inOrderList.get(i);
if(Character.isDigit(s.charAt(0))||(s.length()>1&&s.charAt(0)=='-')){
//此处包括正数和负数
result.add(s);
}else{
switch (s.charAt(0)) {
case '(':
stack.push(s);
break;
case ')':
while (!stack.peek().equals("(")) {
result.add(stack.pop());
}
stack.pop();
break;
default:
while (!stack.isEmpty() && compare(stack.peek(),s)){
result.add(stack.pop());
}
stack.push(s);
break;
}
}
}
while(!stack.isEmpty()){
result.add(stack.pop());
}
return result;
}
/** 计算后缀表达式 */
public static Integer calculate(ArrayList<String> postOrder){
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < postOrder.size(); i++) {
String s=postOrder.get(i);
if(Character.isDigit(s.charAt(0))||(s.length()>1&&s.charAt(0)=='-')){
//此处包括正数和负数
stack.push(Integer.parseInt(postOrder.get(i)));
}else{
Integer back = (Integer)stack.pop();
Integer front = (Integer)stack.pop();
Integer res = 0;
switch (postOrder.get(i).charAt(0)) {
case '+':
res = front + back;
break;
case '-':
res = front - back;
break;
case '*':
res = front * back;
break;
case '/':
res = front / back;
break;
}
stack.push(res);
}
}
return (Integer)stack.pop();
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String s=in.nextLine();//String s = "12+(23*3-56+7)*(2+90)/2";
s=s.replace('[', '(');
s=s.replace(']', ')');
s=s.replace('{', '(');
s=s.replace('}', ')');
ArrayList<String> result = getStringList(s); //String转换为List
result = getPostOrder(result); //中缀变后缀
int i = calculate(result); //计算
System.out.println(i);
}
}
参考:http://blog.csdn.net/yhhazr/article/details/7947962#comments