算术表达式计算(栈的应用)

问题描述

给定一个算术表达式字符串(如”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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值