zoukankan      html  css  js  c++  java
  • java四则运算

      最近老师要写四则运算,通过自己的理解终于完成了,绝对是最容易懂的四则运算!
      首先将运算式分解长一个一个的字符串再加入到一个队列里面,再建立两个站,一个用来存储运算数,一个存放运算符,其中比较运算符的关系是关键,如果栈顶元素优先级底,则从队列里面得到的运算符会直接进栈,如果相等则是要消除(),大于就是要进行出栈运算,将结果再加入到运算数栈中去,直到得到运算符栈中为#和list为空为止。
      github地址:https://github.com/ICanV/EvaluateExpression

      上代码:
    package demo2; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class EvaluateExpression { public static void main(String[] args) { String s="(3*2+(20-12))/2+(2+3)"; EvaluateExpression e=new EvaluateExpression (); System.out.println("计算结果为:"+e.Evaluate(e. makeList(s))); } public List<String> makeList(String str){ List<String> list = new ArrayList<String>(); String temp=""; for(int i=0;i<str.length();i++){ char ch=str.charAt(i); //判断是否为数字 if (Character.isDigit(ch)) { temp+=String.valueOf(ch); }else{ if(!temp.equals("")){ list.add(temp); } list.add(String.valueOf(ch)); temp=""; } } if(!temp.equals("")){ list.add(temp); } list.add("#"); return list; } public String compare(String str1,String str2){ switch(str1){ case "+": if(str2.equals("+")) return ">"; if(str2.equals("-")) return ">"; if(str2.equals("*")) return "<"; if(str2.equals("/")) return "<"; if(str2.equals("(")) return "<"; if(str2.equals(")")) return ">"; if(str2.equals("#")) return ">"; break; case "-": if(str2.equals("+")) return ">"; if(str2.equals("-")) return ">"; if(str2.equals("*")) return "<"; if(str2.equals("/")) return "<"; if(str2.equals("(")) return "<"; if(str2.equals(")")) return ">"; if(str2.equals("#")) return ">"; break; case "*": if(str2.equals("+")) return ">"; if(str2.equals("-")) return ">"; if(str2.equals("*")) return ">"; if(str2.equals("/")) return ">"; if(str2.equals("(")) return "<"; if(str2.equals(")")) return ">"; if(str2.equals("#")) return ">"; break; case "/": if(str2.equals("+")) return ">"; if(str2.equals("-")) return ">"; if(str2.equals("*")) return ">"; if(str2.equals("/")) return ">"; if(str2.equals("(")) return "<"; if(str2.equals(")")) return ">"; if(str2.equals("#")) return ">"; break; case "(": if(str2.equals("+")) return "<"; if(str2.equals("-")) return "<"; if(str2.equals("*")) return "<"; if(str2.equals("/")) return "<"; if(str2.equals("(")) return "<"; if(str2.equals(")")) return "="; if(str2.equals("#")) return ">"; break; case ")": if(str2.equals("+")) return ">"; if(str2.equals("-")) return ">"; if(str2.equals("*")) return ">"; if(str2.equals("/")) return ">"; if(str2.equals(")")) return ">"; if(str2.equals("#")) return ">"; break; case "#": if(str2.equals("+")) return "<"; if(str2.equals("-")) return "<"; if(str2.equals("*")) return "<"; if(str2.equals("/")) return "<"; if(str2.equals("(")) return "<"; break; } return null; } public boolean isHave(String s){ String[] strs={"+","-","*","/","(",")","#"}; for(int i=0;i<strs.length;i++){ if(strs[i].indexOf(s)!=-1){ return true; } } return false; } public String Evaluate(List<String> list){ Stack<String> stack0=new Stack<String>();//运算数栈 Stack<String> stack1=new Stack<String>();//运算符栈 stack1.push("#"); String str=list.remove(0); while((!stack1.peek().equals("#")) || (!list.isEmpty())){ if(!this.isHave(str)){ stack0.push(str); str=list.remove(0); }else{ String str1=this.compare(stack1.peek(), str); switch(str1){ case "<": stack1.push(str); str=list.remove(0); break; case "=": stack1.pop(); str=list.remove(0); break; case ">": String ch=stack1.pop(); int result=0; int ch1=Integer.parseInt(stack0.pop()); int ch0=Integer.parseInt(stack0.pop()); if(ch.equals("+")) result=ch0+ch1; if(ch.equals("-")) result=ch0-ch1; if(ch.equals("*")) result=ch0*ch1; if(ch.equals("/")) result=ch0/ch1; stack0.push(String.valueOf(result)); break; } } } return stack0.peek(); } }
    运算结果截图:

    版权声明:本文为博主原创文章,转载请声明。

    
    

      

  • 相关阅读:
    【React Native】某个页面禁用物理返回键
    【React Native】DeviceEventEmitter监听通知及带参数传值
    转载【React Native代码】手写验证码倒计时组件
    【React Native】 中设置 APP 名称、应用图标、为安卓添加启动图
    【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
    【React Native错误集】Import fails with "Failed to execute 'ImportScripts' on 'WorkerGlobalScope'"
    【React Native错误集】Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app
    「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
    【React Native】Error: Attribute application@allowBackup value=(false) from AndroidManifest.xml
    坚果云如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
  • 原文地址:https://www.cnblogs.com/liupeixuan/p/7531287.html
Copyright © 2011-2022 走看看