Java實現(xiàn)計算器的代碼
用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ù)表達式計算結(jié)果
* 1、當前字符串為數(shù)字時,直接入棧
* 2、當前字符串為計算符時,取出棧中的前兩個計算
* 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 進行格式化 轉(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Springboot不能自動提交數(shù)據(jù)庫連接問題
在使用SSM框架開發(fā)時,若在同一Service內(nèi)部方法間互相調(diào)用,直接使用this關(guān)鍵字會導致事務(wù)管理失效,從而引發(fā)如數(shù)據(jù)庫連接不足等問題,原因是通過this調(diào)用不會經(jīng)過Spring的代理,因此不會自動進行事務(wù)處理2024-09-09
Spring?Boot?集成Redisson實現(xiàn)分布式鎖詳細案例
這篇文章主要介紹了Spring?Boot?集成Redisson實現(xiàn)分布式鎖詳細案例,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08
JAVA如何把數(shù)據(jù)庫的數(shù)據(jù)處理成樹形結(jié)構(gòu)
本文介紹了JAVA如何把數(shù)據(jù)庫的數(shù)據(jù)處理成樹形結(jié)構(gòu),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
java底層JDK?Logging日志模塊處理細節(jié)深入分析
這篇文章主要為大家介紹了java底層JDK?Logging日志模塊處理細節(jié)深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
maven插件maven-jar-plugin構(gòu)建jar文件的詳細使用
maven-jar-plugin插件時maven中最常用的插件,也是maven構(gòu)建Java程序執(zhí)行包或者依賴包的默認插件,本文主要介紹了maven插件maven-jar-plugin構(gòu)建jar文件的詳細使用,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringBoot3實現(xiàn)Gzip壓縮優(yōu)化的技術(shù)指南
隨著 Web 應用的用戶量和數(shù)據(jù)量增加,網(wǎng)絡(luò)帶寬和頁面加載速度逐漸成為瓶頸,為了減少數(shù)據(jù)傳輸量,提高用戶體驗,我們可以使用 Gzip 壓縮 HTTP 響應,本文將介紹如何在 Spring Boot 3 中實現(xiàn) Gzip 壓縮優(yōu)化,需要的朋友可以參考下2025-04-04
使用Mock進行業(yè)務(wù)邏輯層Service測試詳解
這篇文章主要介紹了使用Mock進行業(yè)務(wù)邏輯層Service測試詳解,mock是一種模擬對象的技術(shù),用于在測試過程中替代真實的對象,通過mock,我們可以控制被模擬對象的行為和返回值,以便進行更加精確的測試,需要的朋友可以參考下2023-08-08
Java Spring Security認證與授權(quán)及注銷和權(quán)限控制篇綜合解析
Spring Security 是 Spring 家族中的一個安全管理框架,實際上,在 Spring Boot 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個領(lǐng)域,一直是 Shiro 的天下2021-10-10

