Java實現(xiàn)計算器的代碼
更新時間:2018年06月17日 13:09:35 作者:Owen-Chan
這篇文章主要為大家介紹了Java實現(xiàn)計算器的詳細(xì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
用Java實現(xiàn)的計算器,原理看代碼注釋,具體內(nèi)容如下
public class MyCalculator {
public static void main(String[] args) {
String obj = "6+(8/2)+6/3+1*8 + 30";
ArrayList<String> arrayList = strFormat(obj);
System.out.println(obj + "=" + calculator(arrayList));
}
/**
* 采用后續(xù)表達(dá)式計算結(jié)果
* 1、當(dāng)前字符串為數(shù)字時,直接入棧
* 2、當(dāng)前字符串為計算符時,取出棧中的前兩個計算
* 3、將計算結(jié)果再放入到棧中,棧中最后剩余的一個元素就是要求的結(jié)果
*/
private static int calculator(ArrayList<String> obj) {
ArrayList<String> result = transform(obj);
System.out.println(result);
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < result.size(); i++) {
String symbol = result.get(i);
if (isDigital(symbol)) { //數(shù)字直接入棧
stack.push(Integer.parseInt(symbol));
} else { // 處理操作符
int num1, num2;
num1 = stack.pop(); //取出兩個數(shù)
num2 = stack.pop();
switch (symbol) {
case "+":
stack.push(num2 + num1);
break;
case "-":
stack.push(num2 - num1);
break;
case "*":
stack.push(num2 * num1);
break;
case "/":
stack.push(num2 / num1);
break;
default:
break;
}
}
}
return stack.pop();
}
/**
* 中序遍歷改為后續(xù)遍歷
*/
private static ArrayList<String> transform(ArrayList<String> arrayList) {
Stack<String> stack = new Stack<>();
ArrayList<String> result = new ArrayList<>();
for (int index = 0; index < arrayList.size(); index++) {
String symbol = arrayList.get(index);
if (isDigital(symbol)) { //如果是數(shù)字直接輸出
result.add(symbol);
} else if (symbol.equals(")")) {
String tmp;
while (!(tmp = stack.pop()).equals("(")) { // 匹配成功后停止
result.add(tmp);
}
} else {
if (stack.isEmpty()) {
stack.push(symbol);
continue;
}
String tmp = stack.peek();
while (outPriority(symbol) <= inPriority(tmp)) { //優(yōu)先級小于棧內(nèi)優(yōu)先級,一直出棧
result.add(tmp);
stack.pop();
if (stack.isEmpty()) {
break;
}
tmp = stack.peek();
}
stack.push(symbol);
}
}
//將剩余的出棧
while (!stack.isEmpty()) {
result.add(stack.pop());
}
return result;
}
/**
* 首先對String 進(jìn)行格式化 轉(zhuǎn)化成ArrayList
* @param src 3*5+8;
* @return ArrayList 3 * 5 + 8
*/
private static ArrayList<String> strFormat(String src) {
if (src == null || src.equals("")) {
return null;
}
ArrayList<String> arrayList = new ArrayList<>();
StringBuilder comChar = new StringBuilder();
for (int i = 0; i <src.length(); i++) {
char ch = src.charAt(i);
if (ch == ' ') {
continue; //去除空格
}
if (!Character.isDigit(ch)) {
if (!comChar.toString().trim().equals("")) {
arrayList.add(comChar.toString().trim());
comChar.delete(0, comChar.length());
}
arrayList.add(ch + "");
continue;
}
comChar.append(ch);
}
if (!comChar.toString().trim().equals("")) {
arrayList.add(comChar.toString().trim());
}
return arrayList;
}
/**
* 判斷是否為數(shù)字
* @param symbol 782 或者 + - * /
* @return true or false
*/
private static boolean isDigital(String symbol) {
return !symbol.equals("+") && !symbol.equals("-")
&& !symbol.equals("*") && !symbol.equals("/")
&& !symbol.equals("(") && !symbol.equals(")");
}
private static int inPriority(String ch) {
switch (ch) {
case "+":
case "-":
return 2;
case "*":
case "/":
return 4;
case ")":
return 7;
case "(":
return 1;
default:
return 0;
}
}
private static int outPriority(String ch) {
switch (ch) {
case "+":
case "-":
return 3;
case "*":
case "/":
return 5;
case ")":
return 1;
case "(":
return 7;
default:
return 0;
}
}
}
以上全部為本篇文章的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 處理超大數(shù)類型之BigInteger案例詳解
這篇文章主要介紹了Java 處理超大數(shù)類型之BigInteger案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
JSON.parseObject和JSON.toJSONString實例詳解
這篇文章主要為大家詳細(xì)介紹了JSON.parseObject和JSON.toJSONString實例,具有一定的參考價值,感興趣的朋友可以參考一下2018-06-06
idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案
這篇文章主要介紹了idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案,感興趣的朋友跟隨小編一起看看吧2024-12-12
vue+springboot前后端分離工程跨域問題解決方案解析
這篇文章主要介紹了vue+springboot前后端分離工程跨域問題解決方案解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
SpringBoot整合Echarts實現(xiàn)用戶人數(shù)和性別展示功能(詳細(xì)步驟)
這篇文章主要介紹了SpringBoot整合Echarts實現(xiàn)用戶人數(shù)和性別展示,通過數(shù)據(jù)庫設(shè)計、實現(xiàn)數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和控制層的代碼編寫,以及前端頁面的開發(fā),本文詳細(xì)地介紹了SpringBoot整合Echarts的實現(xiàn)步驟和代碼,需要的朋友可以參考下2023-05-05

