码迷,mamicode.com
首页 > 其他好文 > 详细

表达式求值

时间:2015-01-24 15:46:07      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

表达式求值的步骤:

  1.将中缀表达式改为后缀表达式

  2.后缀表达式求值

 

第一个问题:将中缀表达式改为后缀表达式

  》准备2个堆栈(后缀表达式栈、运算符栈)

  》读取中缀表达式的每个对象,对不同对象按不同的情况处理

    1.运算数:直接输出

    2.左括号:压入堆栈

    3.右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈不输出)

    4.运算符:

      a.若优先级大于栈顶运算符时,则进行压栈

      b.若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈

 

技术分享

package com.wpr.courseDemo1;

import java.util.Stack;

public class Calculate {
    //运算符的优先关系    
    //‘+‘, ‘-‘, ‘*‘, ‘/‘, ‘(‘, ‘)‘    
    static char OprRelation[][] =   {{‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘+‘     
                            {‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘-‘     
                            {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘*‘     
                            {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘/‘     
                            {‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘=‘}, //‘(‘     
                            {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘=‘, ‘>‘} //‘)‘     
                            };     
    
    //判断是否为运算符,暂时只支持+-*/()
    static boolean isOperator(char c){
        if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘||c==‘(‘||c==‘)‘){
            return true;
        }
        return false;
    }
    
    //将运算符转化为数组下标以便进行优先级比较  
    static int ConvertToIndex(char opr)    
    {    
        int index = -1;     
        switch (opr)    
        {    
        case ‘+‘:    
            index = 0;    
            break;    
        case ‘-‘:    
            index = 1;    
            break;    
        case ‘*‘:    
            index = 2;    
            break;    
        case ‘/‘:    
            index = 3;    
            break;    
        case ‘(‘:    
            index = 4;    
            break;    
        case ‘)‘:    
            index = 5;    
            break;    
        }    
        return index;    
    }
    
    //运算符优先级比较  
    static char precede(char opr1, char opr2)    
    {    
        int index1 = ConvertToIndex(opr1);    
        int index2 = ConvertToIndex(opr2);    
        return OprRelation[index1][index2];    
    }    

    static Stack<Character> postfix = new Stack<>();
    static Stack<Character> oper = new Stack<>();
    
    public static void main(String args[]) {
        String str = "2*(9+6/3-5)+4";
        char[] s =str.toCharArray();
        for(char c:s){
            //分4种情况讨论
            if(!isOperator(c)){
                //No1.运算数类型,直接压栈
                postfix.push(c);
            }else{
                //运算符类型
                if(‘(‘==c){
                    //No2.遇到左括号,直接压栈
                    oper.push(c);
                }else if(‘)‘==c){
                    //No3.遇到右括号
                    char temp = oper.pop();
                    while(temp!=‘(‘){
                        postfix.push(temp);
                        temp = oper.pop();
                    }
                }else{
                    //No4.遇到了运算符
                    operNG(c);
                }
            }
        }
        while(!oper.isEmpty()){
            postfix.push(oper.pop());
        }
        //显示一下后缀表达式
        for(char c:postfix){
            System.out.print(c+"\t");
        }
    }
    //处理算术符的优先级不大于栈顶的优先级的情况
    static void operNG(char c){
        if(oper.isEmpty()){
            //如果栈是空的
            oper.push(c);
        }else{
            //栈不空
            char temp = oper.peek();//得到栈顶元素但不删除
            if(precede(temp, c)==‘<‘){
                //栈顶元素优先级<当前运算符的优先级
                oper.push(c);
            }else{
                postfix.push(oper.pop());
                operNG(c);
            };
        }
    }
}

以上则完成了将中缀表达式化为后缀表达式

 

表达式求值

标签:

原文地址:http://www.cnblogs.com/kakaxisir/p/4245894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!