利用棧使用簡(jiǎn)易計(jì)算器(Java實(shí)現(xiàn))
題目:使用棧計(jì)算類似表達(dá)式:5+2*3-2 的計(jì)算結(jié)果
提示:簡(jiǎn)易計(jì)算器操作符號(hào)限于+,-,*,/的計(jì)算
分析思路:
1、創(chuàng)建一個(gè)數(shù)棧和一個(gè)符號(hào)棧,數(shù)棧用于存放數(shù)字,符號(hào)棧用于存放符號(hào)
2、創(chuàng)建一個(gè)索引index,用于遍歷表達(dá)式
3、掃描表達(dá)式,如果是數(shù)字直接進(jìn)入數(shù)棧,如果是符號(hào),則需要進(jìn)行判斷。分兩種情況,一是當(dāng)符號(hào)棧如果為空,直接將符號(hào)入棧。二是不為空,先比較當(dāng)前棧頂?shù)姆?hào)與將要進(jìn)棧的符號(hào)的優(yōu)先級(jí)大小,如果將要進(jìn)棧的操作符的優(yōu)先級(jí)小,則將數(shù)棧的兩個(gè)數(shù)彈出,符號(hào)棧的操作符彈出一個(gè),并進(jìn)行計(jì)算,計(jì)算之后的結(jié)果直接進(jìn)入數(shù)棧,如果優(yōu)先級(jí)大,就直接進(jìn)棧。
4、掃描完表達(dá)式之后,就順序的從數(shù)棧和符號(hào)棧順序的彈出相應(yīng)的數(shù)字和操作符,并進(jìn)行計(jì)算。
5、當(dāng)符號(hào)棧為空時(shí),說(shuō)明已經(jīng)計(jì)算完了,此時(shí)留在數(shù)棧的只有一個(gè)數(shù)字,就是表達(dá)式計(jì)算之后的結(jié)果。
代碼實(shí)現(xiàn)
package cn.mrlij.stack; import java.util.Arrays; import java.util.Scanner; /** * 使用數(shù)組實(shí)現(xiàn)棧 * * @author dreamer * */ public class ArrayStackDemo { public static void main(String[] args) { String express = "5011+2*3-2"; int index = 0;//定義一個(gè)索引值,用于遍歷表達(dá)式 int num1 = 0; int num2 = 0; int res = 0;//計(jì)算結(jié)果 char ch = ' '; int oper = 0; String keepNum = ""; ArrayStack numStack = new ArrayStack(10);//創(chuàng)建一個(gè)數(shù)棧 ArrayStack operStack = new ArrayStack(10);//創(chuàng)建一個(gè)符號(hào)棧 while (true){ ch = express.substring(index,index+1).charAt(0);//不停的遍歷操作符 //判斷是否是操作符 if (operStack.isOper(ch)){ //判斷當(dāng)前符號(hào)棧是否有符號(hào)存在 if(!operStack.isEmpty()){ //不為空則判斷優(yōu)先級(jí) if(operStack.priority(ch)<=operStack.priority(operStack.peek())){ //當(dāng)優(yōu)先級(jí)小于棧頂?shù)闹禃r(shí)候,彈出兩個(gè)數(shù)棧的值進(jìn)行計(jì)算 num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = operStack.cal(num1,num2,oper); //計(jì)算以后將計(jì)算得到的值放入數(shù)棧 numStack.push(res); //同時(shí)將此時(shí)的操作符放入符號(hào)棧 operStack.push(ch); }else{ //優(yōu)先級(jí) operStack.push(ch); } }else{ //為空直接將符號(hào)入棧 operStack.push(ch); } }else { keepNum += ch; //處理多位數(shù) if(express.length()-1 == index){ numStack.push(Integer.parseInt(keepNum)); }else { if(operStack.isOper(express.substring(index+1,index+2).charAt(0))){ numStack.push(Integer.parseInt(keepNum)); keepNum = ""; } } // numStack.push(ch-48); } index++; if(index >= express.length()){ break; } } //掃描完之后,將數(shù)棧的值,與操作符中的值進(jìn)行計(jì)算 while (true){ if(operStack.isEmpty()){ break; } num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = operStack.cal(num1,num2,oper); numStack.push(res); } System.out.println("表達(dá)式:"+express+"="+numStack.pop()); } } class ArrayStack { private int MaxSize;// 定義數(shù)組的最大長(zhǎng)度 private int[] arr;// 定義數(shù)組,數(shù)據(jù)就放在該數(shù)組 private int top = -1;// 定義棧頂,初始化數(shù)據(jù)為-1 public ArrayStack(int maxSize) { this.MaxSize = maxSize; arr = new int[MaxSize]; } // 判斷數(shù)組是否為空 public boolean isEmpty() { return top == -1; } // 判斷數(shù)組是否滿了 public boolean isFull() { //System.out.println("棧頂:" + top + "最大長(zhǎng)度:" + MaxSize); return top == MaxSize - 1; } //取出棧頂元素 public int peek(){ return arr[top]; } // 進(jìn)棧 public void push(int val) { // 先判斷棧是否滿了,滿了就不能添加進(jìn)去 if (isFull()) { System.out.println("棧已經(jīng)滿了~~"); return; } top++; arr[top] = val; } // 出棧 public int pop() { // 先判斷棧是否為空 if (isEmpty()) { throw new RuntimeException("棧為空,無(wú)法出棧!"); } int val = arr[top]; top--; return val; } public void show() { if (isEmpty()) { System.out.println("沒(méi)有數(shù)據(jù)"); return; } for (int i = top; i >= 0; i--) { System.out.print(arr[i] + "\t"); } System.out.println(); } /** * 判斷是否是一個(gè)操作符 * @param oper 傳入的字符 * @return 如是操作符返回true,否則返回false */ public boolean isOper(char oper){ return oper == '+' || oper == '-' || oper =='*' || oper == '/'; } /** * 判斷操作符的優(yōu)先級(jí) * @param oper 傳入的優(yōu)先級(jí) * @return 返回優(yōu)先級(jí) 分別是1,-1,0 */ public int priority(int oper ){ if(oper == '*' || oper == '/'){ return 1; } else if(oper == '+' || oper == '-'){ return 0; }else { return -1; } } //計(jì)算方法 public int cal(int num1,int num2,int oper){ int res = 0; switch (oper){ case '+': res = num1 + num2; break; case '-': res = num2 - num1; break; case '*': res = num1 * num2; break; case '/': res = num2 /num1; } return res; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java簡(jiǎn)易計(jì)算器程序設(shè)計(jì)
- java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
- 基于Java swing組件實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
- Java利用棧實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
- Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App?(Java語(yǔ)言版)
- 如何利用Java?AWT?創(chuàng)建一個(gè)簡(jiǎn)易計(jì)算器
- Java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器(逆波蘭表達(dá)式)
- Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
相關(guān)文章
Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解
這篇文章主要介紹了Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫(kù)中的一個(gè)類,BeanMap?可以將?Java?對(duì)象的屬性作為鍵,屬性值作為對(duì)應(yīng)的值,存儲(chǔ)在一個(gè)?Map?中,它提供了一種將?Java?對(duì)象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下2024-01-01Java?IDEA集成開(kāi)發(fā)工具中英文切換圖文教程
相信很多小伙伴們剛接觸IDEA時(shí),看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關(guān)于Java?IDEA集成開(kāi)發(fā)工具中英文切換的相關(guān)資料,需要的朋友可以參考下2024-04-04使用Autowired為什么會(huì)被IDEA警告最佳修改方法
這篇文章主要介紹了使用Autowired為什么會(huì)被IDEA警告,應(yīng)該怎么修改最佳,除了使用@Autowired以外,我們其實(shí)也有幾種好用的方式,使用@Resource替代@Autiwired方法是其中一種,只需要改變一個(gè)注解,這里就不展示了,需要的朋友可以參考下2023-02-02多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn)
這篇文章主要介紹了多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java之CSV大批量數(shù)據(jù)入庫(kù)的實(shí)現(xiàn)
本文主要介紹了java之CSV大批量數(shù)據(jù)入庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因
這篇文章主要介紹了淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04