日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:栈实现简易计算器

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:栈实现简易计算器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 棧實現簡易計算器
      • 思路
      • 代碼實現
        • 棧結構
        • 運算方法
      • 測試

棧實現簡易計算器

之前的博客已經介紹了棧數據結構,棧有著數據先進后出的特點,因此用于實現簡易計算器時相當方便。本博文中將介紹如何用棧實現一個可以進行簡單四則運算不含括號的簡易計算器(中綴表達式)

思路

  • 首先創建兩個棧,一個用于存儲數而另一個用于存儲運算符號。
  • 首先需要一個index索引來遍歷表達式
  • 遍歷到數字時直接入數棧
  • 遍歷到運算符時需要分情況討論
    • 如果當前符號棧為空直接入棧
    • 如果當前符號棧不為空需要分情況討論
      • 當前遍歷到的運算符的運算優先級小于或者等于棧中的運算符優先級,先從數棧中取出兩個數和從字符棧中取出一個運算符,將其進行運算之后將得到的新的數存入數棧,最后將當前遍歷到的運算符存入字符棧
      • 當前遍歷到的運算符的運算優先級大于棧中的運算符優先級則直接存入字符棧
  • 當表達式遍歷完之后,從數棧和符號棧依次取出相應的數和符號并計算
  • 當數棧只剩下一個數字時,計算完畢,此時該數為最終結果。

代碼實現

棧結構

用之前的方法用數組模擬棧

class CalculatorStack {private int maxSize;private int[] stack;private int top = -1;public CalculatorStack(int maxSize) {this.maxSize = maxSize;stack = new int[maxSize];}/**** @return 返回棧頂的數據<不彈出數據>*/public int peek(){return stack[top];}public boolean isFull(){return top == maxSize - 1;}public boolean isEmpty(){return top == -1;}public void push(int value){if (isFull()){throw new RuntimeException("棧滿無法添加數據....");}top++;stack[top] = value;}public int pop(){if (isEmpty()){throw new RuntimeException("棧空無法返回數據....");}return stack[top--];}}

運算方法

/*** 返回運算符的優先級* @param operation* @return 返回數字代表優先級 數字越大優先級越高*/ public int getPriority(int operation) {if (operation == '*' || operation == '/'){return 1;}else if (operation == '+' || operation == '-'){return 0;}else{throw new RuntimeException("輸入操作符有誤!");} }/*** 判斷是否是運算符* @param val* @return*/ public boolean isOperation(int val) {return val == '+' || val == '-' || val == '*' || val == '/'; }private int calculate(int num1,int num2,int operation) {int result = 0;switch (operation){case '+':result = num2 + num1;break;case '-'://注意順序result = num2 - num1;break;case '*':result = num2 * num1;break;case '/'://注意順序result = num2 / num1;break;}return result; }

核心方法

public static void calculate(String expression) {//創建兩個棧 一個數棧 一個符號棧CalculatorStack numStack = new CalculatorStack(2002);CalculatorStack operationStack = new CalculatorStack(519);//定義相關變量int index = 0;int num1,num2,result;int operation;//用于拼接多位數String keepNum = "";while (true){//依次得到expression中的每一個字符char ch = expression.substring(index, index + 1).charAt(0);//如果是運算符if (operationStack.isOperation(ch)){//判斷符號棧是否為空if (!operationStack.isEmpty()){//如果當前操作符優先級大于棧中的所有操作符,直接入棧if (operationStack.getPriority(ch) > operationStack.getPriority(operationStack.peek())){operationStack.push(ch);}//如果當前操作符的優先級小于或等于棧中的操作符,先彈出符號棧棧頂的操作符和數棧的頭兩個數據else{num1 = numStack.pop();num2 = numStack.pop();operation = operationStack.pop();result = numStack.calculate(num1,num2,operation);//運算結果入數棧numStack.push(result);//符號ch入符號棧operationStack.push(ch);}}else{//符號棧為空直接入棧operationStack.push(ch);}}//如果是數直接入數棧else{//1.當處理多位數時,不可以直接入棧,可能是多位數//2.處理多位數時需要看expression表達式index位置的后一位是什么,如果是數字需要繼續讀取否則直接入棧//3.因此需要定義一個變量字符串用于拼接數字keepNum+=ch;//如果當前處于表達式的末尾if (index == expression.length() - 1){numStack.push(Integer.parseInt(keepNum));keepNum = "";}else{//判斷下一位是否是字符if (operationStack.isOperation(expression.substring(index+1,index+2).charAt(0))){numStack.push(Integer.parseInt(keepNum));//重置keepNum!!!!!keepNum = "";}//1 != '1' ---> 1 = '1' - 48;//numStack.push(ch - 48);}}//讓index+1,并且判斷是否掃描到expression最后index++;if (index >= expression.length()){break;}}//當表達式掃描完畢就順序地從數棧和符號棧中取出相應的數和符號while (true){//如果符號棧為空--->計算完畢if (operationStack.isEmpty()){break;}num1 = numStack.pop();num2 = numStack.pop();operation = operationStack.pop();result = numStack.calculate(num1,num2,operation);numStack.push(result);}result = numStack.pop();System.out.printf("表達式:%s=%d",expression,result); }

測試

public class Calculator {public static void main(String[] args){String expression = "100+20*2-4";CalculatorStack.calculate(expression);} }//-----------------------------------------------------測試結果---------------------------------------------------- 表達式:100+20*2-4=136

以上。

如有不足或錯誤歡迎評論指正

總結

以上是生活随笔為你收集整理的数据结构:栈实现简易计算器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产乱人乱精一区二视频国产精品 | 国模视频一区二区 | 九九久久国产视频 | 日韩精品一线二线三线 | 草久在线观看 | 光棍影院av | av在线视| 国产免费不卡 | free女性xx性老大太 | 中文字幕婷婷 | 玖玖视频网 | 亚洲欧美日韩图片 | 蜜乳av懂色av粉嫩av | 一级大片儿 | 国产精品久久9 | 在线播放波多野结衣 | a天堂在线视频 | 久久久夜色精品亚洲 | 黄色激情av | 成都免费高清电影 | 制服师生在线 | 99国产精品一区 | 日韩黄色影视 | 久久久久久免费视频 | 久久11| 国产乱码在线观看 | 好看的黄色录像 | 青春草视频在线免费观看 | 欧美黄视频在线观看 | 蜜桃久久av | 精品国产乱码久久久久久图片 | 国产精品久久影视 | 夜夜超碰| 嫩草私人影院 | 桃色综合网| 国内自拍在线观看 | 亚洲成人第一页 | 快灬快灬一下爽69 | 熟妇高潮一区二区三区在线播放 | 亚洲 欧美 变态 另类 综合 | 国产一区二区在线观看免费 | 成人免费视频久久 | 亚洲无线观看 | 久久久久国产免费 | 野外性满足hd | 欧美系列在线观看 | 伊人999 | 丁香婷婷在线 | 色欲一区二区三区精品a片 在线观看黄网站 | 亚洲自拍三区 | 天天射天天射 | 任你操精品 | 高清av不卡| 国产亚洲精品久久久久丝瓜 | 在线播放少妇奶水过盛 | 欧美日韩黄色一区二区 | 高跟鞋av| 亚洲精品国产手机 | 三级电影在线看 | 成人福利一区 | 香蕉精品视频在线观看 | 男人的天堂国产 | 国产情侣久久久久aⅴ免费 caoporn成人 | 久久久久成人网站 | 欧美另类性 | 久久久久少妇 | 视频在线观看一区二区 | 色呦呦免费观看 | 激情福利网 | 神马午夜51 | www.精品 | 在线看av网址 | 美国黄色a级片 | 亚洲色图小说 | 国产精品亚洲AV色欲三区不卡 | 99久久久国产精品无码免费 | 青青草成人免费 | 在线免费观看视频 | 国产人成| 成人夜晚看av | 黄一区二区三区 | 色综合五月 | 永久看看免费大片 | 色吊丝一区二区 | 污污视频免费网站 | 日韩成人av一区 | 91私拍| 国产精品成人在线 | v天堂在线观看 | 色屁屁www影院免费观看入口 | 狠狠干在线观看 | 中文字幕第20页 | 欧美色成人 | 暗呦丨小u女国产精品 | 国产精品理论片在线观看 | 日韩性色| 国产黄色在线观看 | 丝袜av网站 | 韩日av在线播放 |