日韩性视频-久久久蜜桃-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

以上。

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

總結

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

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

主站蜘蛛池模板: 亚洲精品一区二区三区蜜臀 | 国产精品一区二区麻豆 | 欧美大片一区二区 | 小sao货大ji巴cao死你 | 欧美绿帽交换xxx | 国产高清欧美 | 日韩欧美一区二区免费 | 欧美寡妇性猛交 | 成人在线a| 色老头网址| 欧美成人黄色 | 日韩中文字幕在线 | 成年网站在线观看 | 成人国产精品免费观看视频 | 韩国三级hd两男一女 | 碰在线视频 | 亚洲欧美激情图片 | 免费黄色链接 | 国产三级小视频 | 欧美二区视频 | 熊出没之冬日乐翻天免费高清观看 | 国产精品v日韩精品v在线观看 | 欧美成人精品一区二区男人小说 | 性久久久久久久 | 国产中文字幕久久 | www,四虎| 国产在线一卡二卡 | 亚洲人在线视频 | 国产视频二 | www.一区二区三区四区 | 亚洲欧美日韩另类在线 | 国内成人免费视频 | 日本中文字幕免费观看 | 樱花动漫无圣光 | 成人靠逼视频 | 99久久久无码国产精品免费蜜柚 | 欧美性做爰免费观看 | 香蕉视频免费网站 | 青娱乐最新视频 | 玖玖国产精品视频 | 国产欧美一区二区三区白浆喷水 | 日韩精品人妻一区二区中文字幕 | 男女男精品网站 | 风流僵尸艳片a级 | 成人免费毛片网 | 三级国产网站 | 欧美人妖69xxxxxhd3d| 天天干天天操天天拍 | 精品国产伦一区 | 国产深夜福利在线 | 久久伊人色 | 久久精品99国产 | 日日摸日日添日日碰9学生露脸 | 91欧美国产| 影音先锋丝袜美腿 | 欧美三区视频 | 国产精品色哟哟 | 日韩精品极品 | 又黄又高潮的视频 | 国产精彩视频 | 国产嫩草影院久久久 | 欧美日韩另类在线 | 精品视频一区二区三区四区五区 | 岳狂躁岳丰满少妇大叫 | 成人午夜又粗又硬又大 | 久久久久久久偷拍 | 一级免费黄色大片 | 少妇高潮迭起 | 日本999视频 | 色骚网| 污网站在线看 | 欧美性xxxxxxxxx| 久久久国产一区 | 在线观看中文字幕码 | 中文字幕日本视频 | 亚洲三级大片 | 免费日批视频 | 成人自拍视频网 | 18岁毛片 | 神马久久影院 | 日韩性生活视频 | 伊人3 | 女同性恋一区二区三区 | 狠狠撸在线视频 | 免费毛片视频网站 | 国产精品成人久久久久久久 | 黄色片小视频 | 视频久久精品 | 国产又色又爽又高潮免费 | 91成人免费观看 | 欧美色综合| www.中文字幕av | 亚洲中文字幕久久无码 | 久久亚洲无码视频 | 天天舔日日操 | 日韩和一区二区 | 久久人人视频 | 国产精品熟妇一区二区三区四区 | 男女考妣视频 |