- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java中如何利用棧使用簡(jiǎn)易計算器
這篇文章主要為大家展示了“Java中如何利用棧使用簡(jiǎn)易計算器”,內容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習一下“Java中如何利用棧使用簡(jiǎn)易計算器”這篇文章吧。
題目:使用棧計算類(lèi)似表達式:5+2*3-2 的計算結果
提示:簡(jiǎn)易計算器操作符號限于+,-,*,/的計算
分析思路:
1、創(chuàng )建一個(gè)數棧和一個(gè)符號棧,數棧用于存放數字,符號棧用于存放符號
2、創(chuàng )建一個(gè)索引index,用于遍歷表達式
3、掃描表達式,如果是數字直接進(jìn)入數棧,如果是符號,則需要進(jìn)行判斷。分兩種情況,一是當符號棧如果為空,直接將符號入棧。二是不為空,先比較當前棧頂的符號與將要進(jìn)棧的符號的優(yōu)先級大小,如果將要進(jìn)棧的操作符的優(yōu)先級小,則將數棧的兩個(gè)數彈出,符號棧的操作符彈出一個(gè),并進(jìn)行計算,計算之后的結果直接進(jìn)入數棧,如果優(yōu)先級大,就直接進(jìn)棧。
4、掃描完表達式之后,就順序的從數棧和符號棧順序的彈出相應的數字和操作符,并進(jìn)行計算。
5、當符號棧為空時(shí),說(shuō)明已經(jīng)計算完了,此時(shí)留在數棧的只有一個(gè)數字,就是表達式計算之后的結果。
代碼實(shí)現
package cn.mrlij.stack; import java.util.Arrays;import java.util.Scanner; /** * 使用數組實(shí)現棧 * * @author dreamer * */public class ArrayStackDemo { public static void main(String[] args) { String express = "5011+2*3-2"; int index = 0;//定義一個(gè)索引值,用于遍歷表達式 int num1 = 0; int num2 = 0; int res = 0;//計算結果 char ch = ' '; int oper = 0; String keepNum = ""; ArrayStack numStack = new ArrayStack(10);//創(chuàng )建一個(gè)數棧 ArrayStack operStack = new ArrayStack(10);//創(chuàng )建一個(gè)符號棧 while (true){ ch = express.substring(index,index+1).charAt(0);//不停的遍歷操作符 //判斷是否是操作符 if (operStack.isOper(ch)){ //判斷當前符號棧是否有符號存在 if(!operStack.isEmpty()){ //不為空則判斷優(yōu)先級 if(operStack.priority(ch)<=operStack.priority(operStack.peek())){ //當優(yōu)先級小于棧頂的值時(shí)候,彈出兩個(gè)數棧的值進(jìn)行計算 num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = operStack.cal(num1,num2,oper); //計算以后將計算得到的值放入數棧 numStack.push(res); //同時(shí)將此時(shí)的操作符放入符號棧 operStack.push(ch); }else{ //優(yōu)先級 operStack.push(ch); } }else{ //為空直接將符號入棧 operStack.push(ch); } }else { keepNum += ch; //處理多位數 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; } } //掃描完之后,將數棧的值,與操作符中的值進(jìn)行計算 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("表達式:"+express+"="+numStack.pop()); }} class ArrayStack { private int MaxSize;// 定義數組的最大長(cháng)度 private int[] arr;// 定義數組,數據就放在該數組 private int top = -1;// 定義棧頂,初始化數據為-1 public ArrayStack(int maxSize) { this.MaxSize = maxSize; arr = new int[MaxSize]; } // 判斷數組是否為空 public boolean isEmpty() { return top == -1; } // 判斷數組是否滿(mǎn)了 public boolean isFull() { //System.out.println("棧頂:" + top + "最大長(cháng)度:" + MaxSize); return top == MaxSize - 1; } //取出棧頂元素 public int peek(){ return arr[top]; } // 進(jìn)棧 public void push(int val) { // 先判斷棧是否滿(mǎn)了,滿(mǎn)了就不能添加進(jìn)去 if (isFull()) { System.out.println("棧已經(jīng)滿(mǎn)了~~"); 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)有數據"); 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)先級 * @param oper 傳入的優(yōu)先級 * @return 返回優(yōu)先級 分別是1,-1,0 */ public int priority(int oper ){ if(oper == '*' || oper == '/'){ return 1; } else if(oper == '+' || oper == '-'){ return 0; }else { return -1; } } //計算方法 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; }}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站