解析算术表达式

解析算术表达式的思路
  1. 算术表达式转换为后缀表达式
    这里写图片描述
  2. 计算后缀表达式的值
    1. 如果是操作数,则压入栈中
    2. 如果是操作符,则从栈中取出两个值,进行运算,把运算之后的值,压入栈中,直到栈为空结束
Java代码
package StackAndQueue;

import java.util.Scanner;

/**
 * Created by ln on 2017/5/14.
 */
public class Postfix3 {

    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        String ss = s.nextLine();
        String love = getValue(ss);
        System.out.println(love);

        int value = getR(love);
        System.out.println(value);
    }

    //后缀表达式求值
    public static int getR(String s){
        Stack stack = new Stack(s.length());
        char v;
        int i1;
        int i2;
        int value;
        for(int i=0;i<s.length();i++){
            v = s.charAt(i);
            if(v>='1'&&v<='9'){
                stack.push(Integer.parseInt(v+""));
            }else {
                i1 = stack.pop();
                i2 = stack.pop();
                value = getYS(v,i2,i1);
                stack.push(value);
            }
        }
        return stack.pop();
    }

    //转换为后缀表达式
    public static String getValue(String s){
        Stack stack = new Stack(s.length());
        String r = "";
        char v;
        int v_p;
        char top;
        int top_p;

        for(int i=0;i<s.length();i++){
            v = s.charAt(i);
            if(v>='1'&&v<'9'){
                r=r+v;
            }else {
                if(stack.isEmpty()){
                    stack.push(v);
                }else {
                    v_p = getL(v);
                    top = (char)stack.pop();
                    top_p=getL(top);
                    if(top_p==3||v=='('||(top_p==1&&v_p==2)){
                        stack.push(top);
                        stack.push(v);
                    }else if(v==')'){
                        while (top!='('){
                            r=r+top;
                            top=(char)stack.pop();
                        }
                    }else if(top_p==v_p){
                        r=r+top;
                        stack.push(v);
                    }else {
                        while (top!='('){
                            r=r+top;
                            if(stack.isEmpty()){
                                break;
                            }
                            top = (char)stack.pop();
                        }
                        stack.push(v);
                    }
                }
            }
        }
        while (!stack.isEmpty()){
            top = (char)stack.pop();
            r=r+top;
        }
        return r;
    }


    //
    public static int getL(char c){
        int v = -1;
        switch (c){
            case '+':
            case '-':v=1;break;
            case '*':
            case '/':v=2;break;
            case '(':
            case ')':v=3;break;
        }
        return v;
    }

    //
    public static int getYS(char c,int i1,int i2){
        int v = 0;
        switch (c){
            case '+':v=i1+i2;break;
            case '-':v=i1-i2;break;
            case '*':v=i1*i2;break;
            case '/':v=i1/i2;break;
        }
        return v;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值