使用棧來完成一個表達式的結果

原文地址:傳送門

使用棧來完成一個表達式的結果

使用棧完成計算 一個表達式的結果

7*2*2-5+1-5+3-4 = ?
3+2*6-2

嗶哩嗶哩動畫

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XzPnJzRe-1614845779689)(https://victorfengming.gitee.io/data_algorithm/img/QQ%E6%88%AA%E5%9B%BE20210220134231.png)]

使用棧完成表達式的計算 思路

  1. 通過一個 index 值(索引),來遍歷我們的表達式
  2. 如果我們發現是一個數字, 就直接入數棧
  3. 如果發現掃描到是一個符號, 就分如下情況
    • 3.1 如果發現當前的符號棧為 空,就直接入棧
    • 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先級小于或者等于棧中的操作符 就需要從數棧中pop出兩個數,在從符號棧中pop出一個符號,進行運算,將得到結果,入數棧,然后將當前的操作符入符號棧, 如果當前的操作符的優先級大于棧中的操作符, 就直接入符號棧.
  4. 當表達式掃描完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,并運行.
  5. 最后在數棧只有一個數字,就是表達式的結果

驗證: 3+2*6-2 = 13

一位數運算

計算

package com.atguigu.stack;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-20 14:02 <br/>* @project data_algorithm* @package com.atguigu.stack*/
public class Calculator {}//先創建一個棧,直接使用前面創建好
//定義一個 ArrayStack2 表示棧, 需要擴展功能
class ArrayStack2 {private int maxSize; // 棧的大小private int[] stack; // 數組,數組模擬棧,數據就放在該數組private int top = -1;// top表示棧頂,初始化為-1//構造器public ArrayStack2(int maxSize) {this.maxSize = maxSize;stack = new int[this.maxSize];}//增加一個方法,可以返回當前棧頂的值, 但是不是真正的poppublic int peek() {return stack[top];}//棧滿public boolean isFull() {return top == maxSize - 1;}//棧空public boolean isEmpty() {return top == -1;}//入棧-pushpublic void push(int value) {//先判斷棧是否滿if(isFull()) {System.out.println("棧滿");return;}top++;stack[top] = value;}//出棧-pop, 將棧頂的數據返回public int pop() {//先判斷棧是否空if(isEmpty()) {//拋出異常throw new RuntimeException("棧空,沒有數據~");}int value = stack[top];top--;return value;}//顯示棧的情況[遍歷棧], 遍歷時,需要從棧頂開始顯示數據public void list() {if(isEmpty()) {System.out.println("棧空,沒有數據~~");return;}//需要從棧頂開始顯示數據for(int i = top; i >= 0 ; i--) {System.out.printf("stack[%d]=%d\n", i, stack[i]);}}//返回運算符的優先級,優先級是程序員來確定, 優先級使用數字表示//數字越大,則優先級就越高.public int priority(int oper) {if(oper == '*' || oper == '/'){return 1;} else if (oper == '+' || oper == '-') {return 0;} else {return -1; // 假定目前的表達式只有 +, - , * , /}}//判斷是不是一個運算符public boolean isOper(char val) {return val == '+' || val == '-' || val == '*' || val == '/';}//計算方法public int cal(int num1, int num2, int oper) {int res = 0; // res 用于存放計算的結果switch (oper) {case '+':res = num1 + num2;break;case '-':res = num2 - num1;// 注意順序break;case '*':res = num1 * num2;break;case '/':res = num2 / num1;break;default:break;}return res;}}

啟動

    public static void main(String[] args) {//根據前面老師思路,完成表達式的運算String expression = "7*2*2-5+1-5+3-4"; // 15//如何處理多位數的問題?//創建兩個棧,數棧,一個符號棧ArrayStack2 numStack = new ArrayStack2(10);ArrayStack2 operStack = new ArrayStack2(10);//定義需要的相關變量int index = 0;//用于掃描int num1 = 0; int num2 = 0;int oper = 0;int res = 0;char ch = ' '; //將每次掃描得到char保存到chString keepNum = ""; //用于拼接 多位數//開始while循環的掃描expressionwhile(true) {//依次得到expression 的每一個字符ch = expression.substring(index, index+1).charAt(0);//判斷ch是什么,然后做相應的處理if(operStack.isOper(ch)) {//如果是運算符//判斷當前的符號棧是否為空if(!operStack.isEmpty()) {//如果符號棧有操作符,就進行比較,如果當前的操作符的優先級小于或者等于棧中的操作符,就需要從數棧中pop出兩個數,//在從符號棧中pop出一個符號,進行運算,將得到結果,入數棧,然后將當前的操作符入符號棧if(operStack.priority(ch) <= operStack.priority(operStack.peek())) {num1 = numStack.pop();num2 = numStack.pop();oper = operStack.pop();res = numStack.cal(num1, num2, oper);//把運算的結果如數棧numStack.push(res);//然后將當前的操作符入符號棧operStack.push(ch);} else {//如果當前的操作符的優先級大于棧中的操作符, 就直接入符號棧.operStack.push(ch);}}else {//如果為空直接入符號棧..operStack.push(ch); // 1 + 3}} else { //如果是數,則直接入數棧//numStack.push(ch - 48); //? "1+3" '1' => 1//分析思路//1. 當處理多位數時,不能發現是一個數就立即入棧,因為他可能是多位數//2. 在處理數,需要向expression的表達式的index 后再看一位,如果是數就進行掃描,如果是符號才入棧//3. 因此我們需要定義一個變量 字符串,用于拼接//處理多位數keepNum += ch;//如果ch已經是expression的最后一位,就直接入棧if (index == expression.length() - 1) {numStack.push(Integer.parseInt(keepNum));}else{//判斷下一個字符是不是數字,如果是數字,就繼續掃描,如果是運算符,則入棧//注意是看后一位,不是index++if (operStack.isOper(expression.substring(index+1,index+2).charAt(0))) {//如果后一位是運算符,則入棧 keepNum = "1" 或者 "123"numStack.push(Integer.parseInt(keepNum));//重要的!!!!!!, keepNum清空keepNum = "";}}}//讓index + 1, 并判斷是否掃描到expression最后.index++;if (index >= expression.length()) {break;}}//當表達式掃描完畢,就順序的從 數棧和符號棧中pop出相應的數和符號,并運行.while(true) {//如果符號棧為空,則計算到最后的結果, 數棧中只有一個數字【結果】if(operStack.isEmpty()) {break;}num1 = numStack.pop();num2 = numStack.pop();oper = operStack.pop();res = numStack.cal(num1, num2, oper);numStack.push(res);//入棧}//將數棧的最后數,pop出,就是結果int res2 = numStack.pop();System.out.printf("表達式 %s = %d", expression, res2);}

原文地址:傳送門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JM與h264標準中的關鍵字說明

有些亂&#xff0c;先存著&#xff0c;留著看 如何結合H.264標準看JM代碼》這個web文件&#xff0c;大家都應該有了吧。不過&#xff0c;那個web文檔是“H.264樂園”群中聊天的內容 1、一個sps后&#xff0c;有若干個pps嗎&#xff1f; 這主要又編碼器決定&#xff0c;但J…

云計算(cloud computing)十大問答

本文講的是云計算&#xff08;cloud computing&#xff09;十大問答&#xff0c;【IT168 資訊】云計算這個新名詞最近甚囂塵上&#xff0c;最近周圍不少朋友都在談&#xff0c;有必要寫一個關于云計算的科普了。  一般的業界比較喜歡用一些新名詞來體現 自己的戰略眼光和與對…

3150cdn打印機清零 hl_兄弟HL-3150/3140彩色打印機粉盒清零方法,我們提前了解一下...

原標題&#xff1a;兄弟HL-3150/3140彩色打印機粉盒清零方法&#xff0c;我們提前了解一下對于兄弟品牌的打印機&#xff0c;相信各位經銷商朋友都遇到過&#xff0c;更換新的粉盒或者加粉后還會提示墨粉不足、更換碳粉盒、更換硒鼓。這個情況需要在機器上操作清零&#xff01;…

Python 關于bytes類方法對數字轉換的誤區, Json的重要性

本文起源于一次犯錯, 在發覺bytes()里面可以填數字, 轉出來的也是bytes類型, 就心急把里面的東西decode出來. 結果為空.搞來搞去以為是命令不熟練事實上錯在邏輯.a1 bytes(11, encodingutf-8) print(a1)b1 a1.decode()print(b1)a2 bytes(11) print(a2)b2 a2.decode() print…

前綴中綴后綴表達式的計算求值

原文在這里 表達式 前綴表達式(波蘭表達式) 前綴表達式又稱波蘭式,前綴表達式的運算符位于操作數之前舉例說明&#xff1a; (34)5-6 對應的前綴表達式就是 - 3 4 5 6 前綴表達式求值 前綴表達式的計算機求值 從右至左掃描表達式&#xff0c;遇到數字時&#xff0c;將數…

psnr 計算

PSNR是“Peak Signal to Noise Ratio”的縮寫&#xff0c;峰值信噪比。psnr一般是用于最大值信號和背景噪音之間的一個工程項目。 PSNR計算公式如下&#xff1a; 8bits表示法中&#xff0c;peak的最大值為255&#xff1b;MSE指Mean Square Error&#xff08;均方誤差&#xff0…

光源時間_縮短背光源的使用壽命的原因

許多場所都會使用到led這種產品&#xff0c;這種產品經常用于背光的照亮中。但是由于使用led的局限性較大&#xff0c;所以led逐漸被背光源這種產品所代替&#xff0c;常常用于背景的照亮讓宣傳圖可以展現出更好的視覺&#xff0c;這也是許多人選擇背光源的原因。那么&#xff…

《結對-貪吃蛇-需求分析》

結對編程&#xff1a;貪吃蛇項目 準備階段&#xff1a;安裝Python、pygame 編寫階段&#xff1a;1. 設置游戲窗口 2. 設置游戲必要功能&#xff1a; a)開始、暫停、退出按鈕 b)貪吃蛇身體 c)食物 d)移動貪吃蛇所需按鍵 3. 完善游戲&#xff1a;添加游戲時間、貪吃蛇失敗次數…

視頻中場的問題2009-04-03 19:38(一)

視頻中場的問題2009-04-03 19:38(一) 場的用途&#xff1a; 讓25幀/秒的電視畫面幀速率&#xff0c;變為50幀/秒。使觀眾感受到更加流暢的畫面。 (二) 場的由來&#xff1a; 在電視制作的時候&#xff0c;電視掃描一副畫面的時間根據當地交流電源的頻率來確定。比如中國交流電源…

遞歸應用場景和調用機制

原文鏈接:傳送門 遞歸 迷宮問題(回溯) 概念 簡單吶的說: 遞歸就是方法自己調用自己,每次調用時傳入不同的變量,遞歸有助于編程者解決復雜的問題,同時讓代碼變得簡潔. 案例-遞歸調用機制 打印問題 public static void test(int n){if(n>2){test(n-1);}System.out.print…

在vivado里用rtl描述_如何利用Vivado HLS處理許多位準確或任意精度數據類型

我們在設計硬件時&#xff0c;它往往是要求更精確的位寬。例如&#xff0c;一個filter的輸入是12位和一個累加器的結果只需要一個最大范圍為27位。然而對于硬件設計來說&#xff0c;使用標準的C數據類型會造成硬件成本的浪費。這就會造成我們要使用更多的LUT和寄存器&#xff0…

Spring4.0之四:Meta Annotation(元注解)

Spring框架自2.0開始添加注解的支持&#xff0c;之后的每個版本都增加了更多的注解支持。注解為依賴注入&#xff0c;AOP&#xff08;如事務&#xff09;提供了更強大和簡便的方式。這也導致你要是用一個相同的注解到許多不同的類中去。這篇文章介紹meta annotation來解決這個問…

八皇后問題分析與Java實現

原文鏈接:傳送門 八皇后問題 八皇后問題&#xff0c;是一個古老而著名的問題&#xff0c;是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯貝瑟爾于1848年提出&#xff1a;在88格的國際象棋上擺放八個皇后&#xff0c;使其不能互相攻擊&#xff0c;即&#xff1a;任意兩個…

各種音視頻編解碼學習詳解 h264 ,mpeg4 ,aac 等所有音視頻格式

編解碼學習筆記&#xff08;一&#xff09;&#xff1a;基本概念 媒體業務是網絡的主要業務之間。尤其移動互聯網業務的興起&#xff0c;在運營商和應用開發商中&#xff0c;媒體業務份量極重&#xff0c;其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最…

shell 腳本比較字符串相等_shell腳本--邏輯判斷與字符串比較

涉及到比較和判斷的時候&#xff0c;要注意整數比較使用-lt&#xff0c;-gt&#xff0c;ge等比較運算符&#xff0c;詳情參考&#xff1a;整數比較文件測試使用 -d, -f, -x等運算發&#xff0c;詳情參考&#xff1a;文件測試邏輯判斷使用 &&(且)、||(或)、&#xff…

單例模式之惡漢模式(詳解)

一.設計模式 概念&#xff1a;設計模式是一套被反復使用、多人知曉的、經過分類編目的、代碼設計經驗的總結。 目的&#xff1a;是用設計模式可以重用代碼&#xff0c;讓代碼更容易被他人理解&#xff0c;保證代碼的可靠性。 二.為什么要使用單例模式&#xff1f; 如果創造出多…

JSP中的:request.getScheme()+://+request.getServerName()+:+request.getServer

String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; <base href" <%basePath%>"> 這個語句是用來拼裝當前網頁的相對…

迷宮回溯問題分析和實現

原文鏈接:傳送門 迷宮問題 說明: 小球得到的路徑&#xff0c;和程序員設置的找路策略有關即&#xff1a;找路的上下左右的順序相關再得到小球路徑時&#xff0c;可以先使用(下右上左)&#xff0c;再改成(上右下左)&#xff0c;看看路徑是不是有變化測試回溯現象思考: 如何求出…

canvas clear 指定屬性的元素_好程序員web前端分享CSS屬性組成及作用

好程序員web前端分享CSS屬性組成及作用學習目標1、css屬性和屬性值的定義2、css文本屬性3、css列表屬性4、css背景屬性5、css邊框屬性6、css浮動屬性一、css屬性和屬性值的定義屬性&#xff1a;屬性是指定選擇符所具有的屬性&#xff0c;它是css的核心&#xff0c;css2共有150多…

mybatis大于小于等于

大于&#xff1a;<![CDATA[>]]> 小于&#xff1a;<![CDATA[<]]> 等于&#xff1a;<![CDATA[]]> 大于等于&#xff1a;<![CDATA[>]]> 小于等于&#xff1a;<![CDATA[<]]>轉載于:https://www.cnblogs.com/YuanFan123/p/7234530.html