⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eval.java

📁 java内表达式求值源码。适用于Java项目中进行表达式计算。
💻 JAVA
字号:
/**
 * 表达式求值Java粗糙版
 */
package com.yovn.algo;

import java.util.Stack;
import java.util.Vector;

/**
 * @author yovn
 *
 */
public class Caculator {

    
    class Item
    {
        boolean ops;
        int value;
        
        Character opVal;
        int opPriority;
    }
    
    Stack<Item> opStack=new Stack<Item>();
    Vector<Item> calcStack=new Vector<Item>();
    /**
     * 
     */
    public Caculator() {
        // TODO Auto-generated constructor stub
    }
    
    
    
    
    public int calc()
    {
        Stack<Item> tmp=new Stack<Item>();
        while(!calcStack.isEmpty())
        {
            Item it=calcStack.remove(0);
            
            if(!it.ops)
            {
                tmp.push(it);
            }
            else
            {
                int op2=tmp.pop().value;
                int op1=tmp.pop().value;
                Item newItem=new Item();
                newItem.ops=true;
                switch(it.opVal)
                {
                case '+':
                    newItem.value=op1+op2;
                    
                    break;
                case '-':
                    newItem.value=op1-op2;
                    break;
                case '*':
                    
                    newItem.value=op1*op2;
                    break;
                case '/':
                    newItem.value=op1/op2;
                    break;
                }
                tmp.push(newItem);
            }
        }
        return tmp.pop().value;
    }
    /**
     * 1)数字直接输出
     * 2)开括号则压栈
     * 3)闭括号把栈中元素依次输出直到遇到开括号
     * 4)运算符时
     *     a)循环,当栈非空,并且栈顶元素不是开括号,并且栈顶运算符优先级不低于输入的运算符的优先级,反复将其输出
     *     b)把输入运算符压栈
     * 5)输出栈内剩余元素
     * @param in
     * @return
     */
    public String transInfixToPosfix(String in)
    {
        char[] cin=in.toCharArray();
        StringBuffer buffer=new StringBuffer();
       
        for(int i=0;i<cin.length;i++)
        {
            Item newItem=new Item();
            newItem.opPriority=1;
            newItem.ops=false;
            
            switch(cin[i])
            {
            
            case '+':
                newItem.opPriority=1;
                newItem.ops=true;
                newItem.opVal='+';
                doOps(buffer, newItem);
                
                break;
            case '-':
                newItem.opPriority=1;
                newItem.ops=true;
                newItem.opVal='-';
                doOps(buffer, newItem);
                break;
            case '*':
                newItem.opPriority=2;
                newItem.ops=true;
                newItem.opVal='*';
                doOps(buffer, newItem);
                break;
            case '/':
                newItem.opPriority=2;
                newItem.ops=true;
                newItem.opVal='/';
                doOps(buffer, newItem);
                break;
                
            case '(':
                newItem.ops=true;
                newItem.opVal='(';
                opStack.push(newItem);
                
                break;
            case ')':
                boolean meetClose=false;
                while(!opStack.isEmpty())
                {
                    Item item=opStack.peek();
                    if(item.ops&&item.opVal!='(')
                    {
                        calcStack.add(item);
                        opStack.pop();
                        buffer.append(item.opVal);
                    }
                    else if(item.ops)
                    {
                        opStack.pop();
                        meetClose=true;
                        break;
                    }
                }
                if(!meetClose)
                {
                    throw new RuntimeException();
                }
                break;
                
            default:
                int j=i;
                for(;j<cin.length&&cin[j]>='0'&&cin[j]<='9';j++);
                if(j==i)
                {
                    throw new RuntimeException("wrong input.");
                }
                newItem.ops=false;
                newItem.value=Integer.parseInt(new String(cin,i,j-i));
                buffer.append(newItem.value);
                calcStack.add(newItem);
                i=j-1;
                break;
                
                
            }
        }
        while(!opStack.isEmpty())
        {
            Item item=opStack.pop();
            calcStack.add(item);
            buffer.append(item.opVal);
            
        }
        return buffer.toString();
        
    }



    private void doOps(StringBuffer buffer, Item newItem) {
        while(!opStack.isEmpty())
        {
            Item item=opStack.peek();
            if(item.opVal!='('&&item.opPriority>=newItem.opPriority)
            {
                calcStack.add(item);
                opStack.pop();
                buffer.append(item.opVal);
            }
            else
            {
                break;
            }
        }
        opStack.push(newItem);
    }
    

    /**
     * @param args
     */
    public static void main(String[] args) {
        Caculator calc=new Caculator();
        
        System.out.println("1+2*3+7-(4/2+8)/5="+calc.transInfixToPosfix("1+2*3+7-(4/2+8)/5"));
        System.out.println("value is:"+calc.calc());

    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -