Java-表达式求值

代码

NewStack.java


import java.util.LinkedList;
/**
 * 泛型栈
 * @author 焦焱-16060211104
 *
 * @param <T> 需要存储的类型
 */
public class NewStack<T> {
private LinkedList<T> St = new LinkedList<T>(); //存数据
/**
 * 入栈
 * @param e 数据
 */
public void push(T e)
{
    St.addFirst(e);
}
/**
 * 出栈
 * @return 数据
 */
public T Pop()
{
    if(empty())
    {
        System.out.println("栈空");
        return null;
    }else
    return St.removeFirst();
}
/**
 * 判断是否为空栈
 * @return true或者false
 */
public boolean empty()
{
    return St.isEmpty();
}
/**
 * 获得栈顶元素
 * @return 数据
 */
public T Top()
{
    if(empty())
    {
        System.out.println("栈空");
        return null;
    }else
    return St.getFirst();
}
/**
 * 返回当前栈中元素数目
 * @return
 */
public int Num()
{
    return St.size();
}
}

Calculation.java

package ThreeOne;
/**
 * 计算类
 * @author 焦焱-16060211104
 *进行计算
 */
public class Calculation {
static void Calculate(String a)
{   char temp;
    double f;
    /**
     * 一个符号栈一个数据栈
     */
    NewStack<Character> optr = new NewStack<Character>();
    NewStack<Double> opnd = new NewStack<Double>();
    optr.push('#');
    for(int i=0;i<a.length();i++)
    {   //用来转化数字
        StringBuilder num = new StringBuilder();
        switch (a.charAt(i))
        {
        /*进行优先级判断,如果高于栈顶元素则入栈,负责进行计算,然后将结果压入操作数栈,
         当前操作符添加到操作符栈
        */
        case '+':
        case '-':
            temp = optr.Top();
            if(temp=='#'||temp=='(')
            {
                optr.push(a.charAt(i));
            }
            else
            {
                double One = opnd.Pop();
                double Two = opnd.Pop();
                char Three = optr.Pop();
                opnd.push(Operation(Two, One, Three));
            }
            break;
        case '*':
        case '/':
            temp = optr.Top();
            if(Rank(a.charAt(i))>Rank(temp)|| temp == '(')
            {
                optr.push(a.charAt(i));
            }
            else
            {
                double One = opnd.Pop();
                double Two = opnd.Pop();
                char Three = optr.Pop();
                opnd.push(Operation(Two, One, Three));
            }
            break;
        case '(':
            optr.push(a.charAt(i));
            break;
        case ')':
        temp = optr.Top();
        while(temp!='(')
        {
            double One = opnd.Pop();
            double Two = opnd.Pop();
            char Three = optr.Pop();
            opnd.push(Operation(Two, One, Three));
            temp = optr.Top();
        }
        temp=optr.Pop();
            break;
        default:
        /*
         * 处理数字,并将其入栈
         */
        while(a.charAt(i)>='0'&&a.charAt(i)<='9'||a.charAt(i)=='.'){
            num.append(a.charAt(i));    
            i++;
            if(i==a.length())
                break;
            }
        i--;
            f=Double.valueOf(num.toString());
            opnd.push(f);
            break;
        }
    }
    temp = optr.Top();
    /*
     * 进行最后的计算,如果操作符栈顶不为#则运算还没全部完成
     */
    while(temp!='#')
    {
        double One = opnd.Pop();
        double Two = opnd.Pop();
        char Three = optr.Pop();
        opnd.push(Operation(Two, One, Three));
        temp = optr.Top();
    }
    double result = opnd.Top();
    System.out.println(result);
}
/**
 * 划分优先级
 * @param e 当前操作符
 * @return 操作符优先级数
 */
private static int Rank(char e)
{
    switch (e) {
    case '#':
        return 0;
    case '(':
        return 1;
    case '+':
    case '-':
        return 2;
    case '*':
    case '/':
        return 3;
    default:
        return -1;
    }
}
/**
 * 运算
 * @param a
 * @param b
 * @param c
 * @return
 */
private static double Operation(double a,double b,char c)
{
    double d=-1;
    switch (c) {
    case '+':
        d= a+b;
        break;
    case '-':
        d=a-b;
        break;
    case '*':
        d=a*b;
        break;
    case '/':
        if(b==0){
            System.out.println("分母为0");
            return -1;
        }
        else
        d=a/b;
        break;
    default:
        System.out.println("输入的字符不合法");
        break;
    }
    return d;
}
}

Test.java


import java.util.Scanner;

public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = "(1+2)*(4/2)";
Calculation.Calculate(a);
}
}

结果

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中求后缀表达式的值可以通过栈来实现。具体步骤如下: 1.将后缀表达式转换为字符串数组。 2.遍历字符串数组,如果当前元素是数字,则将其压入栈中;如果当前元素是运算符,则从栈中弹出两个元素进行运算,并将结果压入栈中。 3.遍历完字符串数组后,栈中只剩下一个元素,即为后缀表达式的值。 下面是一个Java求后缀表达式的例子: ```java import java.util.Stack; public class PostfixExpression { public static void main(String[] args) { String[] postfix = {"3", "4", "5", "*", "+"}; float result = evaluatePostfix(postfix); System.out.println("The value of the postfix expression is: " + result); } public static float evaluatePostfix(String[] postfix) { Stack<Float> stack = new Stack<Float>(); for (int i = 0; i < postfix.length; i++) { String token = postfix[i]; if (isOperator(token)) { float operand2 = stack.pop(); float operand1 = stack.pop(); float result = applyOperator(token, operand1, operand2); stack.push(result); } else { float operand = Float.parseFloat(token); stack.push(operand); } } return stack.pop(); } public static boolean isOperator(String token) { return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"); } public static float applyOperator(String operator, float operand1, float operand2) { if (operator.equals("+")) { return operand1 + operand2; } else if (operator.equals("-")) { return operand1 - operand2; } else if (operator.equals("*")) { return operand1 * operand2; } else { return operand1 / operand2; } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值