• 课堂练习之四则运算


    本次课程学习四则运算的加强

      1 package com.baidu;
      2 
      3 
      4 import java.text.NumberFormat;
      5 import java.util.ArrayList;
      6 import java.util.Stack;
      7 
      8 
      9 public class CalculateStack {
     10 static private CalculateStack cl = new CalculateStack();
     11 private Stack<String> num = new Stack<>();
     12 private Stack<Character> opStack = new Stack<>();
     13 private RuleTable ruleTable = new RuleTable();
     14 private double getCalculateNumber(double num1,Character op,double num2) {
     15 
     16 double res = 0;
     17 switch(op.charValue()) {
     18 
     19 case '+':{
     20 res = num1 + num2;
     21 }break;
     22 
     23 case '-':{
     24 res = num1 - num2;
     25 }break;
     26 case 'x':{
     27 
     28 res = num1 * num2;
     29 }break;
     30 case '/':{
     31 
     32 res = num1 / num2;
     33 }break;
     34 
     35 }
     36 return res;
     37 }
     38 private char serchOp(char ch, char top) {
     39 
     40 //System.out.println("ch:"+ch+" top:"+top);
     41 for(Rule rule:this.ruleTable.getRuleList()) {
     42 if(top == rule.ch1&&rule.ch2 == ch) {
     43 //System.out.println("从表中找到:关系为top" + rule.equ +"ch");
     44 return rule.equ;
     45 }
     46 }
     47 return '@';
     48 }
     49 public String Calculate(String strSource,int Accuracy) {
     50 boolean ret = true;
     51 
     52 Object[] ch1 = this.strToOpStr(strSource);
     53 for(int i = 0; i < ch1.length; i++) {
     54 if(ch1[i].toString().isEmpty())
     55 break;
     56 if(!this.isOperator(ch1[i].toString())) {
     57 this.num.push(ch1[i].toString());
     58 
     59 }else {
     60 //System.out.println(ch);
     61 switch(this.serchOp(ch1[i].toString().charAt(0),this.opStack.lastElement())){
     62 case '<':{
     63 
     64 this.opStack.push(new Character(ch1[i].toString().charAt(0)));
     65 //System.out.println(ch1[i].charAt(0)+"压入操作符");
     66 }break;
     67 case '>': {
     68 double num2 = Double.valueOf(this.num.pop());
     69 
     70 double num1 = Double.valueOf(this.num.pop());
     71 
     72 char op = this.opStack.pop();
     73 //System.out.println(ch1[i].charAt(0)+"弹出操作符");
     74 this.num.push(new Double(this.getCalculateNumber(num1, op, num2)).toString());
     75 i--;
     76 }break;
     77 case '@': {
     78 System.out.println("不合法的表达式");
     79 ret = false;
     80 }break;
     81 
     82 case '=': {
     83 //去括号,#号
     84 this.opStack.pop();
     85 //System.out.println(ch1[i].charAt(0)+"弹出操作符");
     86 }break;
     87 }
     88 }
     89 }
     90 NumberFormat nb = NumberFormat.getNumberInstance();
     91 nb.setMinimumFractionDigits(Accuracy);
     92 double res = Double.valueOf(this.num.pop());
     93 
     94 return ret?nb.format(res):null;
     95 }
     96 private boolean CheckeStr(String strSource) {
     97 
     98 char[] chSource = strSource.toCharArray();
     99 for(int i = 1; i < chSource.length; i++) {
    100 if((chSource[i-1] == '('||chSource[i-1] == ')')&&!this.isOperater(chSource[i])) {
    101 return false;
    102 }else if((chSource[i] == '('||chSource[i] == ')')&&!this.isOperater(chSource[i-1])) {
    103 return false;
    104 }
    105 }
    106 return true;
    107 }
    108 
    109 
    110 private CalculateStack() {
    111 this.num.push(new Integer(0).toString());
    112 this.opStack.push(new Character('#'));
    113 }
    114 private boolean isOperator(String str) {
    115 
    116 if(str.toCharArray().length == 1) {
    117 for(char ch:RuleTable.op) {
    118 if(ch == str.toCharArray()[0])
    119 return true;
    120 }
    121 }else if(str.isEmpty()){
    122 return false;
    123 }else {
    124 return false;
    125 }
    126 return false;
    127 }
    128 
    129 //此方法实现把操作符和操作数解析为字符串数组
    130 private Object[] strToOpStr(String strSource) {
    131 int num = 0;
    132 boolean isOp = true;
    133 String[] retStr = new String[100];
    134 
    135 char[] ch = strSource.toCharArray();
    136 for(char ch1:ch) {
    137 if(this.isOperater(ch1)&&num == 0&&!isOp) {
    138 num++;
    139 retStr[num++] = new String(new Character(ch1).toString());
    140 isOp = true;
    141 }else if(this.isOperater(ch1)&&num == 0&&isOp) {
    142 retStr[num++] = new String(new Character(ch1).toString());
    143 isOp = true;
    144 }else if(this.isOperater(ch1)&&num != 0){
    145 if(!isOp)
    146 num++;
    147 retStr[num++] = new String(new Character(ch1).toString());
    148 isOp = true;
    149 }else if(!this.isOperater(ch1)&&num != 0){
    150 if(retStr[num] == null)
    151 retStr[num] = new String(new Character(ch1).toString());
    152 else {
    153 retStr[num] += ch1;
    154 }
    155 
    156 isOp = false;
    157 }else if(!this.isOperater(ch1)&&num == 0) {
    158 
    159 if(isOp) {
    160 //System.out.println("opchar:" + ch1+"op:"+isOp+"num:"+num);
    161 retStr[num] = new String(new Character(ch1).toString());
    162 //System.out.println("opchar:" + ch1+"op:"+isOp+"num:"+num+"rerStr:"+retStr[num]);
    163 }else {
    164 retStr[num] += ch1;
    165 //System.out.println("opchar:" + ch1+"op:"+isOp+"num:"+0+"rerStr:"+retStr[0]);
    166 }
    167 isOp = false;
    168 }
    169 }
    170 ArrayList<String> list = new ArrayList<>();
    171 for(int i = 0; i < retStr.length; i++) {
    172 if(retStr[i] != null) {
    173 list.add(retStr[i]);
    174 }
    175 }
    176 list.add(list.size(),"#");
    177 return list.toArray();
    178 }
    179 private boolean isOperater(char ch) {
    180 
    181 for(char ch1:RuleTable.op) {
    182 if(ch == ch1)
    183 return true;
    184 }
    185 return false;
    186 }
    187 //demo
    188 public static void main(String[] args) {
    189 
    190 CalculateStack cl = CalculateStack.getCalculateInstance();
    191 System.out.println(cl.Calculate("(3x4)/1.11-3x45+12-12333", 1));
    192 
    193 }
    194 static public CalculateStack getCalculateInstance() {
    195 return cl;
    196 }
    197 }
    198 
    199 
    200 package com.baidu;
    201 
    202 import java.util.ArrayList;
    203 
    204 public class RuleTable {
    205 static public char[] op = {
    206 '+',
    207 '-',
    208 'x',
    209 '/',
    210 '(',
    211 ')',
    212 '#'
    213 };
    214 private int[][] re = {
    215 {1,1,-1,-1,-1,1,1},
    216 {1,1,-1,-1,-1,1,1},
    217 {1,1,1,1,-1,1,1},
    218 {1,1,1,1,-1,1,1},
    219 {-1,-1,-1,-1,-1,0,2},
    220 {1,1,1,1,-2,1,1},
    221 {-1,-1,-1,-1,-1,2,0},
    222 };
    223 private ArrayList<Rule> ruleList = new ArrayList<>();
    224 
    225 public ArrayList<Rule> getRuleList() {
    226 return this.ruleList;
    227 }
    228 public RuleTable() {
    229 
    230 for(int i = 0; i < op.length; i++) {
    231 for(int j = 0; j < op.length; j++) {
    232 Rule rule = new Rule();
    233 rule.ch1 = op[i];
    234 rule.ch2 = op[j];
    235 if(re[i][j] == 1) {
    236 rule.equ = '>';
    237 }else if(re[i][j] == -1) {
    238 rule.equ = '<';
    239 }else if(re[i][j] == 0) {
    240 rule.equ = '=';
    241 }else {
    242 rule.equ = '@';
    243 }
    244 
    245 ruleList.add(rule);
    246 }
    247 }
    248 }
    249 }
    250 class Rule {
    251 char ch1 = 0;
    252 char ch2 = 0;
    253 char equ = 0;
    254 }
  • 相关阅读:
    ASP.NET的底层体系1
    MVC路由解析---IgnoreRoute
    HTTP协议详解(三)
    HTTP协议详解(二)
    HTTP协议详解(一)
    优化MySQL服务器
    知识管理系列---3.程序实现
    Linux上PHP加入环境变量
    php-fpm 服务
    centos 服务器编译安装apache+php
  • 原文地址:https://www.cnblogs.com/w669399221/p/13083416.html
Copyright © 2020-2023  润新知