国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)——基本計(jì)算器的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)——基本計(jì)算器的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

????????

目錄

一、不帶括號(hào)的計(jì)算器

1.整體思想:

2.具體細(xì)節(jié):

? ? ? ? (1)字符串中有空格

? ? ? ? (2)表達(dá)式開(kāi)頭可能是符號(hào)

? ? ? ? (3)將數(shù)字放在第一個(gè)棧中

? ? ? ? (4)出現(xiàn)“*”和“/”

? ? ? ? (5)出現(xiàn)“+”和“-”

????????(6)完成運(yùn)算

3.完整代碼:

二、帶括號(hào)的計(jì)算器

完整代碼:

代碼簡(jiǎn)化:


????????計(jì)算器是我們生活中經(jīng)常會(huì)用到的物品,現(xiàn)在我們需要利用棧和隊(duì)列的知識(shí),來(lái)自己編寫(xiě)一個(gè)程序,來(lái)實(shí)現(xiàn)計(jì)算器的基本功能。

一、不帶括號(hào)的計(jì)算器

? ? ? ? 在運(yùn)算中,我們需要遵循運(yùn)算符號(hào)的優(yōu)先級(jí),先乘除,后加減,有括號(hào)的先運(yùn)算括號(hào)里面的。由此可見(jiàn),在加上括號(hào)后,難度會(huì)有點(diǎn)兒大,所以我們現(xiàn)在先完成不帶括號(hào)的計(jì)算器,后面在實(shí)現(xiàn)帶括號(hào)的計(jì)算器。

1.整體思想:

? ? ? ? 表達(dá)式以字符串形式給予的,所以我們需要在字符上進(jìn)行操作。我們可以創(chuàng)建兩個(gè)棧,一個(gè)用來(lái)存放數(shù)據(jù)元素,一個(gè)用來(lái)存放符號(hào)元素。在符號(hào)棧里面獲取到符號(hào)后,將數(shù)據(jù)棧里面的兩個(gè)元素出棧進(jìn)行操作,然后再放回到數(shù)據(jù)棧里面。如此操作,最后便能得到這個(gè)表達(dá)式的運(yùn)算結(jié)果。

2.具體細(xì)節(jié):

? ? ? ? 在代碼實(shí)現(xiàn)的過(guò)程中,會(huì)出現(xiàn)一些問(wèn)題,接下來(lái)我會(huì)一一解答并附上解決的代碼。

? ? ? ? (1)字符串中有空格

可以在所有運(yùn)算前,將字符串里的所有空格刪除或替換。(replace()方法來(lái)替換字符串里的空格)

 String s = "1+2 / 5";
s = s.replace(" ", "");
//s="1+2/5"

? ? ? ? (2)表達(dá)式開(kāi)頭可能是符號(hào)

在字符串前加一個(gè)"0"(如果是"-"開(kāi)頭,在運(yùn)算時(shí),沒(méi)有與之匹配的前一項(xiàng)數(shù)據(jù)元素,會(huì)有報(bào)錯(cuò))

String s="-1+2";
s = '0' + s;
//s="0-1+2"

? ? ? ? (3)將數(shù)字放在第一個(gè)棧中

數(shù)字可能會(huì)不止一位,所以我們需要判斷數(shù)字的位數(shù),然后再進(jìn)行存放

   char c = s.charAt(i);//循環(huán)得到字符串的每一個(gè)字符
if (c >= '0' && c <= '9') {//判斷字符是不是數(shù)字
   int x = 0;
   while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
/*
循環(huán)遍歷,如果下一個(gè)字符依舊是數(shù)字,就將前面的字符乘10作為上一位,加后面的字符
-"0"是為了將字符轉(zhuǎn)為數(shù)字(減的是ASKII碼值,例如"0"-"0"就是0的ASKII減去0的ASKII,得到的數(shù)也就是0)
*/
       x = x * 10 + s.charAt(i++) - '0';//得到多位數(shù)的數(shù)字
   }
   i--;//在判斷是否為數(shù)字時(shí)得到的字符會(huì)多加一位,會(huì)出現(xiàn)跳過(guò)下一個(gè)字符的情況,所以要對(duì)索引進(jìn)行減1的操作
   stack1.push(x);
 }

? ? ? ? (4)出現(xiàn)“*”和“/”

乘除需要先進(jìn)行運(yùn)算,運(yùn)算時(shí)需要獲取后面的元素和剛剛?cè)霔5脑?。在獲取后面的元素時(shí)也需要進(jìn)行判斷元素的位數(shù),才能進(jìn)行運(yùn)算。

if (i > 0 && (c == '*' || c == '/')) {
   int num1 = stack1.pop();
   int num2 = 0;
   while (i + 1 < s.length() && (s.charAt(i + 1) == ' ')) {
      i++;
   }
   int temp = 0;
   while (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
      temp = temp * 10 + s.charAt(i + 1) - '0';
      i++;
   }
   num2 = temp;
   if (c == '*') {
      stack1.push(num1 * num2);
   } else {
      stack1.push(num1 / num2);
     }
}

? ? ? ? (5)出現(xiàn)“+”和“-”

加減運(yùn)算的優(yōu)先級(jí)沒(méi)有乘除高,但是加減是平級(jí)的,所以運(yùn)算是從左到右運(yùn)算。具體實(shí)現(xiàn)是:如果符號(hào)棧里面沒(méi)有元素,就先將獲取的“+”或“-”存放到棧中,如果有元素,則先將元素出棧,進(jìn)行運(yùn)算后,放到數(shù)據(jù)棧中,再將剛剛得到的“+”或“-”符號(hào)存放到棧中,等待下一次的判斷。

if (c == '+' || c == '-') {
    while (!stack2.isEmpty()) {
           char op = stack2.pop();
           int num1 = stack1.pop();
           int num2 = stack1.pop();
           if (op == '+') {
                stack1.push(num1 + num2);
           } else {
                stack1.push(num2 - num1);
             }
           }
    stack2.push(c);
}

????????(6)完成運(yùn)算

在整個(gè)字符串遍歷完后,如果符號(hào)棧中沒(méi)有元素了,則返回?cái)?shù)據(jù)棧中的那個(gè)唯一的元素,就是表達(dá)式的值,如果符號(hào)棧中還有元素,則進(jìn)行最后的運(yùn)算,得到的值進(jìn)行返回即可

while (!stack2.isEmpty()) {
     char op = stack2.pop();
     int num1 = stack1.pop();
     int num2 = stack1.pop();
     if (op == '+') {
        stack1.push(num1 + num2);
     } else {
        stack1.push(num2 - num1);
       }
     }
return stack1.pop();

3.完整代碼:

package com.algo.lesson.lesson02;

import java.util.Stack;

public class Solution_227 {

    public static void main(String[] args) {
        String s = "1*2-3/4+5*6-7*8+9/10";
        Solution_227 solution_227 = new Solution_227();
        System.out.println(solution_227.calculate(s));

    }

    public int calculate(String s) {
        int n = 0;
        Stack<Integer> stack1 = new Stack<>();
        Stack<Character> stack2 = new Stack<>();
        s = '0' + s;
        s = s.replace(" ", "");
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                int x = 0;
                while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    x = x * 10 + s.charAt(i++) - '0';
                }
                i--;
                stack1.push(x);
            }
            if (i > 0 && (c == '*' || c == '/')) {
                int num1 = stack1.pop();
                int num2 = 0;
                while (i + 1 < s.length() && (s.charAt(i + 1) == ' ')) {
                    i++;
                }
                int temp = 0;
                while (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
                    temp = temp * 10 + s.charAt(i + 1) - '0';
                    i++;
                }
                num2 = temp;
                if (c == '*') {
                    stack1.push(num1 * num2);
                } else {
                    stack1.push(num1 / num2);
                }
            }
            if (c == '+' || c == '-') {
                while (!stack2.isEmpty()) {
                    char op = stack2.pop();
                    int num1 = stack1.pop();
                    int num2 = stack1.pop();
                    if (op == '+') {
                        stack1.push(num1 + num2);
                    } else {
                        stack1.push(num2 - num1);
                    }
                }
                stack2.push(c);
            }
        }
        while (!stack2.isEmpty()) {
            char op = stack2.pop();
            int num1 = stack1.pop();
            int num2 = stack1.pop();
            if (op == '+') {
                stack1.push(num1 + num2);
            } else {
                stack1.push(num2 - num1);
            }
        }
        return stack1.pop();
    }

}

二、帶括號(hào)的計(jì)算器

? ? ? ? 不帶括號(hào)的計(jì)算器已經(jīng)完成了,只需要再添加一個(gè)判斷括號(hào)的條件就行。

if (s.charAt(i + 1) == '(') {
    int j = i + 2;
    int count = 1;
    while (count != 0) {
        j++;
        if (s.charAt(j) == '(') {
            count++;
        } else if (s.charAt(j) == ')') {
             count--;
        }
    }
    num2 = calculate(s.substring(i + 2, j));
    i = j;
}

完整代碼:

package com.algo.lesson.lesson02;

import java.util.Stack;

public class Solution_227 {

    public static void main(String[] args) {
        String s = "1*2-3/4+5*6-7*8+9/10";
        Solution_227 solution_227 = new Solution_227();
        System.out.println(solution_227.calculate(s));

    }

    public int calculate(String s) {
        int n = 0;
        Stack<Integer> stack1 = new Stack<>();
        Stack<Character> stack2 = new Stack<>();
        s = '0' + s;
        s = s.replace(" ", "");
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                int x = 0;
                while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    x = x * 10 + s.charAt(i++) - '0';
                }
                i--;
                stack1.push(x);
            } else if (c == '+' || c == '-' || c == '(') {
                stack2.push(c);
            } else if (c == ')') {
                while (stack2.peek() != '(') {
                    char op = stack2.pop();
                    int num1 = stack1.pop();
                    int num2 = stack1.pop();
                    if (op == '+') {
                        stack1.push(num1 + num2);
                    } else {
                        stack1.push(num2 - num1);
                    }
                }
                stack2.pop(); // 彈出左括號(hào)
            } else if (c == '*' || c == '/') {
                while (!stack2.isEmpty()) {
                    char op = stack2.pop();
                    int num1 = stack1.pop();
                    int num2 = stack1.pop();
                    if (op == '+') {
                        stack1.push(num1 + num2);
                    } else {
                        stack1.push(num2 - num1);
                    }
                }
                stack2.push(c);
            }
        }
        while (!stack2.isEmpty()) {
            char op = stack2.pop();
            int num1 = stack1.pop();
            int num2 = stack1.pop();
            if (op == '+') {
                stack1.push(num1 + num2);
            } else {
                stack1.push(num2 - num1);
            }
        }
        return stack1.pop();
    }

}

代碼簡(jiǎn)化:

只使用一個(gè)棧就可以實(shí)現(xiàn),一些判斷方法也可以直接調(diào)用Java中的方法。

感興趣的可以自行閱讀:

public class Solution {
    public int calculate(String s) {
        int result = 0;
        int num = 0;
        int sign = 1;
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            } else if (c == '+' || c == '-') {
                result += sign * num;
                num = 0;
                sign = (c == '+') ? 1 : -1;
            } else if (c == '(') {
                stack.push(result);
                stack.push(sign);
                result = 0;
                sign = 1;
            } else if (c == ')') {
                result += sign * num;
                num = 0;
                result *= stack.pop();
                result += stack.pop();
            }
        }
        result += sign * num;
        return result;
    }
}

以上就是Java利用棧來(lái)實(shí)現(xiàn)計(jì)算器的代碼,在LeetCode中也有相對(duì)應(yīng)的題目,感興趣的可以前往相應(yīng)題目看一看:

力扣(LeetCode)官網(wǎng) - 全球極客摯愛(ài)的技術(shù)成長(zhǎng)平臺(tái)(不帶括號(hào)的計(jì)算器)

力扣(LeetCode)官網(wǎng) - 全球極客摯愛(ài)的技術(shù)成長(zhǎng)平臺(tái)(帶括號(hào)的計(jì)算器)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-815107.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)——基本計(jì)算器的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 224. 基本計(jì)算器

    題目鏈接:224. 基本計(jì)算器 代碼如下:

    2024年01月19日
    瀏覽(18)
  • 【LeetCode專(zhuān)題#基本計(jì)算器】基本計(jì)算器I,圖解中序表達(dá)式轉(zhuǎn)逆波蘭表達(dá)式,太難了

    【LeetCode專(zhuān)題#基本計(jì)算器】基本計(jì)算器I,圖解中序表達(dá)式轉(zhuǎn)逆波蘭表達(dá)式,太難了

    https://leetcode.cn/problems/basic-calculator/?envType=listenvId=cKNEfNsF 給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來(lái)計(jì)算并返回它的值。 注意:不允許使用任何將字符串作為數(shù)學(xué)表達(dá)式計(jì)算的內(nèi)置函數(shù),比如 eval() 。 示例 1: 輸入:s = \\\"1 + 1\\\" 輸出:2 示例 2: 輸入:s = \\\" 2-1 + 2 \\\" 輸出

    2024年02月08日
    瀏覽(19)
  • 計(jì)算機(jī)組成與結(jié)構(gòu)實(shí)驗(yàn)一《運(yùn)算器組成》

    一、實(shí)驗(yàn)?zāi)康呐c要求 一、實(shí)驗(yàn)?zāi)康?(1)熟悉TEC-8模型計(jì)算機(jī)的節(jié)拍脈沖T1T2T3 (2)熟悉TEC-8模型機(jī)雙端口通用寄存器組的讀寫(xiě)操作 (3)熟悉TEC-8模型機(jī)運(yùn)算器的數(shù)據(jù)傳送通路 (4)驗(yàn)證74181的加、減、與、或功能 (5)按給定的數(shù)據(jù),完成幾種指定的算術(shù)運(yùn)算和邏輯運(yùn)算 二、

    2024年02月04日
    瀏覽(22)
  • Golang每日一練(leetDay0081) 基本計(jì)算器I\II Basic Calculator

    Golang每日一練(leetDay0081) 基本計(jì)算器I\II Basic Calculator

    目錄 224. 基本計(jì)算器 Basic Calculator???????? 227. 基本計(jì)算器 II Basic Calculator?????? ?? 每日一練刷題專(zhuān)欄??? Rust每日一練 專(zhuān)欄 Golang每日一練 專(zhuān)欄 Python每日一練 專(zhuān)欄 C/C++每日一練 專(zhuān)欄 Java每日一練 專(zhuān)欄 給你一個(gè)字符串表達(dá)式? s ?,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來(lái)計(jì)算并返

    2024年02月07日
    瀏覽(40)
  • 計(jì)算機(jī)組成與體系結(jié)構(gòu)第一次試驗(yàn):運(yùn)算器實(shí)驗(yàn)

    計(jì)算機(jī)組成與體系結(jié)構(gòu)第一次試驗(yàn):運(yùn)算器實(shí)驗(yàn)

    為了幫助同學(xué)們完成痛苦的實(shí)驗(yàn)課程設(shè)計(jì),本作者將其作出的實(shí)驗(yàn)結(jié)果及代碼貼至CSDN中,供同學(xué)們學(xué)習(xí)參考。如有不足或描述不完善之處,敬請(qǐng)各位指出,歡迎各位的斧正! 掌握使用算術(shù)邏輯運(yùn)算器 74LS181 進(jìn)行算術(shù)運(yùn)算、 邏輯運(yùn)算的方法。 掌握基于“累加-移位”原理的串

    2024年02月04日
    瀏覽(18)
  • 前端實(shí)現(xiàn)科學(xué)計(jì)算器

    前端實(shí)現(xiàn)科學(xué)計(jì)算器

    這個(gè)作業(yè)屬于哪個(gè)課程 https://bbs.csdn.net/forums/ssynkqtd-05 這個(gè)作業(yè)要求在哪里 https://bbs.csdn.net/topics/617294583 這個(gè)作業(yè)的目標(biāo) 完成一個(gè)具有可視化界面的計(jì)算器 其他參考文獻(xiàn) 無(wú) 源代碼鏈接 PSP Personal Software Process Stages 預(yù)估耗時(shí)(分鐘) 實(shí)際耗時(shí)(分鐘) Planning 計(jì)劃 60 40 ? Est

    2024年02月07日
    瀏覽(26)
  • pyqt 實(shí)現(xiàn)計(jì)算器

    pyqt 實(shí)現(xiàn)計(jì)算器

    文件名為:untitled.py QApplication: QApplication 類(lèi)管理圖形用戶(hù)界面應(yīng)用程序的控制流和主要設(shè)置。 可以說(shuō) QApplication是Qt的整個(gè)后臺(tái)管理的命脈 app = QApplication(sys.argv)這句作用用來(lái)初始化窗口系統(tǒng)? app.exec(): app.exec_()的作用是運(yùn)行主循環(huán),必須調(diào)用此函數(shù)才能開(kāi)始事件處理,調(diào)用該

    2024年02月16日
    瀏覽(23)
  • Java 實(shí)現(xiàn)計(jì)算器

    Java 實(shí)現(xiàn)計(jì)算器

    *使用Java語(yǔ)言編寫(xiě)一個(gè)能實(shí)現(xiàn)“加、減、乘、除”四則運(yùn)算的計(jì)算器程序。* 要求: (1)在程序中要體現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言的三大特征:封裝、繼承和多態(tài)。 (2)該程序要易于擴(kuò)展和復(fù)用。以后可以方便地增加新的運(yùn)算;程序的業(yè)務(wù)邏輯與界面部分要實(shí)現(xiàn)分離,便于業(yè)務(wù)邏

    2024年02月12日
    瀏覽(21)
  • Android計(jì)算器實(shí)現(xiàn)

    Android計(jì)算器實(shí)現(xiàn)

    這個(gè)項(xiàng)目是一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用,它可以執(zhí)行加、減、乘、除四種基本運(yùn)算等計(jì)算器的基本功能。我們將使用Android Studio作為開(kāi)發(fā)工具。 1. 在Android Studio中創(chuàng)建新的Android項(xiàng)目。 2. 在布局文件(`activity_main.xml`)中,我們將添加一個(gè)按鈕和一個(gè)用于顯示結(jié)果的文本視圖。 3. 在

    2024年02月07日
    瀏覽(27)
  • 實(shí)現(xiàn)復(fù)數(shù)計(jì)算器

    實(shí)現(xiàn)復(fù)數(shù)計(jì)算器

    ????????本論文描述了一個(gè)復(fù)數(shù)計(jì)算器的設(shè)計(jì)和實(shí)現(xiàn),旨在擴(kuò)展傳統(tǒng)計(jì)算器的功能,以支持復(fù)數(shù)的加法、減法、乘法和除法。通過(guò)使用Java編程語(yǔ)言和Swing圖形用戶(hù)界面庫(kù),我們創(chuàng)建了一個(gè)直觀、易于使用的界面,允許用戶(hù)輸入復(fù)數(shù),并執(zhí)行基本的算術(shù)運(yùn)算。 ????????計(jì)

    2024年02月02日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包