国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現四則混合運算代碼示例

Java實現四則混合運算代碼示例

2021-01-14 15:52joshuasabrina Java教程

這篇文章主要介紹了Java實現四則混合運算代碼示例,文中展示了詳細代碼,具有一定參考價值,需要的朋友可以了解下。

使用棧來實現,可以處理運算優先級。

使用自然四則運算表達式即可,如:4+(3*(3-1)+2)/2。無需把表達式先轉換為逆波蘭等形式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package com.joshua.cal;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
public class Calculator {
  private final Stack<Double> numStack = new Stack<Double>();
  private final Stack<Character> opStack = new Stack<Character>();
  private char currentOperator;
  private char opStackTop;
  private int i;
  private String expression;
  @SuppressWarnings("rawtypes")
  public void exec(String expression) {
    try {
      clean();
      if (expression == null || expression.isEmpty()) {
        throw new IllegalArgumentException("Blank Expression!");
      }
      this.expression = expression;
      opStack.push(TERMINATE_TOKENS.START_END_MARK);
      List tokens = TOKENIZER.exec(expression
          + TERMINATE_TOKENS.START_END_MARK);
      for (; i < tokens.size(); i++) {
        final Object token = tokens.get(i);
        if (token instanceof Double) {
          processOperand((double) token);
        } else {
          processOperator((char) token);
        }
      }
    } catch (Throwable e) {
      System.err.println(String.format(
          "Incorret Expression: %s\nError: %s", expression,
          e.getMessage()));
    }
  }
  private void processOperand(final double operand) {
    numStack.push(operand);
  }
  private void processOperator(final char currentOperator) {
    this.currentOperator = currentOperator;
    this.opStackTop = opStack.peek();
    char calMode = CALCULATE_MODE.getRule(currentOperator, opStackTop);
    switch (calMode) {
    case '>':
      processStackHigerPriorityOperator();
      break;
    case '<':
      processStackLowerPriorityOperator();
      break;
    case '=':
      processStackEqualPriorityOperator();
      break;
    default:
      break;
    }
  }
  private void processStackLowerPriorityOperator() {
    opStack.push(currentOperator);
  }
  private void processStackHigerPriorityOperator() {
    numStack.push(CALCULATE.exec(opStack.pop(), numStack.pop(),
        numStack.pop()));
    --i; // pointer back to the previous operator.
  }
  private void processStackEqualPriorityOperator() {
    if (TERMINATE_TOKENS.START_END_MARK == currentOperator) {
      System.out.println(expression + " = " + numStack.peek());
    } else if (')' == currentOperator) {
      opStack.pop();
    }
  }
  public void clean() {
    numStack.clear();
    opStack.clear();
    i = 0;
  }
  public static void main(String[] args) {
    Calculator cal = new Calculator();
    cal.exec("4+(3*(3-1)+2)/2"); // = 8
    cal.exec("4 + (-3 * ( 3 - 1 ) + 2)"); // = 0
    cal.exec("4 +-/ (-3 * ( 3 - 1 ) + 2)"); // incorrect expression!
    cal.exec("4.5+(3.2+3)/2"); // = 7.6
    cal.exec("4.5+(3.2:3)/2"); // incorrect expression!
    cal.exec("-4.5+(3.2-3)/2"); // = -4.4
  }
}
enum CALCULATE {
  INSTANCE;
  public static double exec(final char operator, final double right,
      final double left) {
    switch (operator) {
    case '+':
      return left + right;
    case '-':
      return left - right;
    case '*':
      return left * right;
    case '/':
      return left / right;
    default:
      throw new IllegalArgumentException("Unsupported operator: "
          + operator);
    }
  }
}
enum TERMINATE_TOKENS {
  INSTANCE;
  public static final char START_END_MARK = '#';
  private static final Map<Character, Integer> TOKENs = new HashMap<Character, Integer>();
  static {
    // token, token id
    TOKENs.put('+', 0);
    TOKENs.put('-', 1);
    TOKENs.put('*', 2);
    TOKENs.put('/', 3);
    TOKENs.put('(', 4);
    TOKENs.put(')', 5);
    TOKENs.put(START_END_MARK, 6);
  }
  private static Set<Character> NEGATIVE_NUM_SENSITIVE = new HashSet<Character>();
  public static synchronized Set<Character> getNegativeNumSensitiveToken() {
    if (NEGATIVE_NUM_SENSITIVE.size() == 0) {
      NEGATIVE_NUM_SENSITIVE.addAll(TOKENs.keySet());
      NEGATIVE_NUM_SENSITIVE.remove(')');
    }
    return NEGATIVE_NUM_SENSITIVE;
  }
  public static boolean isTerminateToken(final char token) {
    Set<Character> keys = TOKENs.keySet();
    return keys.contains(token);
  }
  public static int getTokenId(final char token) {
    return TOKENs.get(token) == null ? -1 : TOKENs.get(token);
  }
  public static int getTokenSize() {
    return TOKENs.size();
  }
}
enum CALCULATE_MODE {
  INSTANCE;
  private static char[][] RULES = {
      // + - * / ( ) #
      { '>', '>', '<', '<', '<', '>', '>' }, // +
      { '>', '>', '<', '<', '<', '>', '>' }, // -
      { '>', '>', '>', '>', '<', '>', '>' }, // *
      { '>', '>', '>', '>', '<', '>', '>' }, // /
      { '<', '<', '<', '<', '<', '=', 'o' }, // (
      { '>', '>', '>', '>', 'o', '>', '>' }, // )
      { '<', '<', '<', '<', '<', 'o', '=' }, // #
  };
  static {
    if (RULES.length != TERMINATE_TOKENS.getTokenSize() || RULES.length < 1
        || RULES[0].length != TERMINATE_TOKENS.getTokenSize()) {
      throw new IllegalArgumentException("Rules matrix is incorrect!");
    }
  }
  public static char getRule(final char currentOperator, final char opStackTop) {
    try {
      return RULES[TERMINATE_TOKENS.getTokenId(opStackTop)][TERMINATE_TOKENS
          .getTokenId(currentOperator)];
    } catch (Throwable e) {
      throw new RuntimeException("No rules were defined for some token!");
    }
  }
}
enum TOKENIZER {
  INSTANCE;
  private static final StringBuilder BUFFER = new StringBuilder();
  private static String clearExpression(String expression) {
    return expression.replaceAll(" ", "");
  }
  private static Character PREVIOUS_CHAR;
  private static void clean() {
    BUFFER.delete(0, BUFFER.length());
    PREVIOUS_CHAR = null;
  }
  private static boolean processNegativeNumbers(final String exp,
      final int index) {
    char c = exp.charAt(index);
    if (('+' == c || '-' == c)
        && (PREVIOUS_CHAR == null || TERMINATE_TOKENS
            .getNegativeNumSensitiveToken().contains(PREVIOUS_CHAR))
        && !TERMINATE_TOKENS.isTerminateToken(exp.charAt(index + 1))) {
      BUFFER.append(c);
      return true;
    }
    return false;
  }
  @SuppressWarnings({ "unchecked", "rawtypes" })
  public static List<?> exec(final String expression) {
    clean();
    String exp = clearExpression(expression);
    List result = new LinkedList();
    for (int i = 0; i < exp.length(); i++) {
      char c = exp.charAt(i);
      if (TERMINATE_TOKENS.isTerminateToken(c)) {
        if (processNegativeNumbers(exp, i))
          continue;
        if (BUFFER.length() > 0) {
          result.add(Double.valueOf(BUFFER.toString()));
          BUFFER.delete(0, BUFFER.length());
        }
        result.add(c);
      } else {
        BUFFER.append(c);
      }
      PREVIOUS_CHAR = c;
    }
    return Collections.unmodifiableList(result);
  }
}

 

輸出

?
1
2
3
4
5
6
7
8
4+(3*(3-1)+2)/2 = 8.0
4 + (-3 * ( 3 - 1 ) + 2) = 0.0
4.5+(3.2+3)/2 = 7.6
-4.5+(3.2-3)/2 = -4.4
Incorret Expression: 4 +-/ (-3 * ( 3 - 1 ) + 2)
Error: null
Incorret Expression: 4.5+(3.2:3)/2
Error: For input string: "3.2:3"

總結

以上就是本文關于Java實現四則混合運算代碼示例的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對服務器之家網站的支持。

原文鏈接:http://joshuasabrina.iteye.com/blog/1947041

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品一区二区三区网站观看 | 午夜看片在线观看 | 亚洲精品在线视频 | 国内精品一区二区三区 | 91在线免费观看 | 欧美国产一区二区三区 | 国产一区二区av | 在线观看黄色电影 | 中文字幕第二页 | 国产毛片毛片 | 亚洲免费观看视频 | 欧美视频在线观看免费 | 黄色网页在线 | 成人av电影网址 | 亚洲精品永久免费 | 99热在线播放 | 色视频www在线播放国产人成 | 成年免费观看 | 91中文字幕 | 欧美日韩国产精品一区二区 | 精品乱码一区二区三四区 | 国产综合精品一区二区三区 | 精品一区二区av | 一本久久a久久精品亚洲 | 综合色播 | 精品国产一区二区三区久久 | 国产资源在线观看视频 | 欧美一级全黄 | 亚洲国产免费 | 欧美一区永久视频免费观看 | 精品综合| 久久水蜜桃 | 中文字幕在线观看视频地址二 | 国产女人爽到高潮免费视频 | 亚洲精品91 | 偷拍一区二区三区 | 成人精品 | 一级特黄毛片 | 日本中文字幕一区 | 国产成人在线一区二区 | 欧美激情精品久久久久久 |