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

Java算法題 給一個(gè)字符串表達(dá)式,實(shí)現(xiàn)一個(gè)基本計(jì)算器,返回計(jì)算結(jié)果

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

題目:

描述
給定一個(gè)字符串描述的算術(shù)表達(dá)式,計(jì)算出結(jié)果值。
輸入字符串長(zhǎng)度不超過(guò) 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。

數(shù)據(jù)范圍:運(yùn)算過(guò)程中和最終結(jié)果均滿足∣val∣≤2^31?1  ,即只進(jìn)行整型運(yùn)算,確保輸入的表達(dá)式合法
        輸入描述:
        輸入算術(shù)表達(dá)式

        輸出描述:
        計(jì)算出結(jié)果值

        示例1
        輸入:
        400+5
        復(fù)制
        輸出:
        405

考點(diǎn):棧

解題思路:

使用 2 個(gè)棧,一個(gè) stack_nums 用來(lái)保存計(jì)算過(guò)程的操作數(shù),一個(gè) stack_symbol 用來(lái)保存運(yùn)算符。

在HashMap中,指定加減優(yōu)先級(jí)為1,乘除優(yōu)先級(jí)為2

循環(huán)遍歷字符串s,

  1. 操作符入棧:

    若當(dāng)前字符為'+', '-', '*', '/', '(' 時(shí),壓入運(yùn)算符棧 stack_symbol,

  2. 操作數(shù)入棧:

    若當(dāng)前字符為數(shù)值類(lèi)型,相當(dāng)于循環(huán)讀取字符串轉(zhuǎn)化為十進(jìn)制整數(shù),直到下一個(gè)字符為非數(shù)值類(lèi)型,把它壓入操作數(shù)棧中。

  3. 執(zhí)行運(yùn)算:

    當(dāng)遍歷到加減乘除運(yùn)算符時(shí),判斷棧stack_symbol內(nèi)存在優(yōu)先級(jí)大于等于當(dāng)前運(yùn)算符,則可以先執(zhí)行一次運(yùn)算,盡可能先消費(fèi)棧stack_symbol內(nèi)的運(yùn)算符;

    當(dāng)右括號(hào)出現(xiàn)時(shí)需要執(zhí)行一次優(yōu)先級(jí)運(yùn)算,并從操作符棧內(nèi)彈出對(duì)應(yīng)的左括號(hào);

  4. 運(yùn)算規(guī)則:棧是后進(jìn)先出,參與加減乘除運(yùn)算時(shí),第一個(gè)從 stack_nums 棧頂彈出的數(shù)應(yīng)在運(yùn)算符后面,第二個(gè) stack_nums 從棧頂彈出的數(shù)應(yīng)在運(yùn)算符前面。

  1. 特殊情況處理:

  • 括號(hào)的處理:

括號(hào)有2種情況,

第一種是負(fù)數(shù)攜帶的括號(hào),即除了第一個(gè)位置出現(xiàn)的數(shù)外,后面的數(shù)為負(fù)數(shù)時(shí)所附帶的括號(hào),

第二種是,需要優(yōu)先進(jìn)行運(yùn)算的式子

  • 負(fù)數(shù)的處理:

對(duì)于負(fù)數(shù)的處理,增加一步 0 - n 運(yùn)算,假設(shè)負(fù)號(hào)后面的數(shù)等于 n

開(kāi)頭第一個(gè)數(shù)帶 '-' 號(hào),s.charAt(0) == '-'

s = "0" + s;

或者括號(hào) () 里面第一個(gè)數(shù)帶 '-' 號(hào),

s = s.replace( "(-", "(0-" );

認(rèn)為是負(fù)號(hào),否則認(rèn)為是減號(hào)

當(dāng)循環(huán)結(jié)束時(shí),若棧stack_symbol內(nèi)還有運(yùn)算符,繼續(xù)算完

import java.util.Scanner;
import java.util.Stack;
import java.util.Map;
import java.util.HashMap;

// 注意類(lèi)名必須為 Main, 不要有任何 package xxx 信息
/**
 * @ClassName
 * @Description
 * @Author liulvhua
 * @Date 2023/4/5
 **/
public class HJ54 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Stack<Integer> stack_nums = new Stack<>();
        Stack<Character> stack_symbol = new Stack<>();
        Map<Character, Integer> map = new HashMap<>();
        map.put('+', 1);
        map.put('-', 1);
        map.put('*', 2);
        map.put('/', 2);
        while (sc.hasNextLine()) {
            String s = sc.nextLine();
            if (s.charAt(0) == '-') {//第一個(gè)數(shù)為負(fù)數(shù)
                s = "0" + s;
            }
            s = s.replace("(-", "(0-");//其他位置負(fù)數(shù)處理
            for (int i = 0; i < s.length(); i++) {
                char ch = s.charAt(i);
                if (ch == ' ') continue;
                if (ch == '(') {
                    stack_symbol.push(ch);
                    continue;
                }
                if (ch == ')') {
                    //括號(hào)結(jié)束計(jì)算一次
                    stack_nums.push(calculate(stack_nums, stack_symbol));
                    if (!stack_symbol.isEmpty() && stack_symbol.peek() == '(') {
                        //當(dāng)前計(jì)算是括號(hào)內(nèi)最后一次運(yùn)算,彈出左括號(hào)
                        stack_symbol.pop();
                    }
                    continue;
                }
                if (map.containsKey(ch)) {
                    // 棧內(nèi)至少有1個(gè)運(yùn)算符且棧頂不是左括號(hào),并且棧內(nèi)運(yùn)算符優(yōu)先級(jí)大于等于當(dāng)前運(yùn)算符號(hào)優(yōu)先級(jí),執(zhí)行一次計(jì)算,
                    // 即先消費(fèi)已入棧的高優(yōu)先級(jí)運(yùn)算符
                    while (!stack_symbol.isEmpty() && stack_symbol.peek() != '(' && map.get(stack_symbol.peek()) >= map.get(ch)) {
                        stack_nums.push(calculate(stack_nums, stack_symbol));
                    }
                    stack_symbol.push(ch);
                } else {
                    int num = 0;
                    int j = i;//循環(huán)讀取十進(jìn)制整數(shù)
                    while (j < s.length() && Character.isDigit(s.charAt(j))) {
                        num = num * 10 + s.charAt(j) - '0';
                        j++;
                    }
                    stack_nums.push(num);
                    i = j - 1;
                }
            }
            // 循環(huán)結(jié)束還有未算盡的式子,優(yōu)先級(jí)低
            while (!stack_symbol.isEmpty()) {
                stack_nums.push(calculate(stack_nums, stack_symbol));
                if (!stack_symbol.isEmpty() && stack_symbol.peek() == '(') {
                    stack_symbol.pop();
                }
            }
            System.out.println(stack_nums.pop());
        }
    }

    /**
     * 執(zhí)行運(yùn)算
     * @param stack_nums 操作數(shù)棧
     * @param stack_symbol 運(yùn)算符棧
     * @return
     */
    public static int calculate(Stack<Integer> stack_nums, Stack<Character> stack_symbol) {
        int res = 0;
        int opt_nums2 = stack_nums.pop();
        int opt_nums1 = stack_nums.pop();
        char symbol = stack_symbol.pop();
        switch (symbol) {
            case '+': {
                res = opt_nums1 + opt_nums2;
                break;
            }
            case '-': {
                res = opt_nums1 - opt_nums2;
                break;
            }
            case '*': {
                res = opt_nums1 * opt_nums2;
                break;
            }
            case '/': {
                res = opt_nums1 / opt_nums2;
                break;
            }
        }
        return res;
    }
}

執(zhí)行用例:

2*3-2*(1-2*2)-0
12
2*3-2*(1-2*(1-3))-0
-4
2*3-2*(1-2*(1-3))-0
-4
2*3-2*(1-2*(1-3)*(-1))-0
12?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729354.html

到了這里,關(guān)于Java算法題 給一個(gè)字符串表達(dá)式,實(shí)現(xiàn)一個(gè)基本計(jì)算器,返回計(jì)算結(jié)果的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • 從零開(kāi)始學(xué)Java56--與字符串相關(guān)的正則表達(dá)式

    從零開(kāi)始學(xué)Java56--與字符串相關(guān)的正則表達(dá)式

    在上一篇文章中給大家介紹了 String字符串及其各種常用API方法 ,接下來(lái)繼續(xù)給大家講解一些 String字符串的高級(jí)玩法。 有時(shí)候我們操作一個(gè)字符串時(shí),這個(gè)字符串的內(nèi)容并不一定就是固定不變的。比如在用戶注冊(cè)時(shí),我們要求用戶在輸入框中輸入自己的手機(jī)號(hào)碼。我們知道,

    2024年02月06日
    瀏覽(24)
  • 56從零開(kāi)始學(xué)Java之與字符串相關(guān)的正則表達(dá)式

    作者 :孫玉昌,昵稱(chēng)【 一一哥 】,另外【 壹壹哥 】也是我哦 CSDN博客專(zhuān)家、萬(wàn)粉博主、阿里云專(zhuān)家博主、掘金優(yōu)質(zhì)作者 在上一篇文章中, 壹哥 給大家介紹了String字符串及其各種常用API方法,接下來(lái) 壹哥 繼續(xù)給大家講解一些String字符串的高級(jí)玩法。 有時(shí)候我們操作一個(gè)字

    2024年02月14日
    瀏覽(17)
  • 【編譯原理】【詞法分析】【正則表達(dá)式】【NFA】【DFA】【C++】正則表達(dá)式轉(zhuǎn)DFA&NFA,判斷字符串是否符合正則表達(dá)式的匹配算法

    【編譯原理】【詞法分析】【正則表達(dá)式】【NFA】【DFA】【C++】正則表達(dá)式轉(zhuǎn)DFA&NFA,判斷字符串是否符合正則表達(dá)式的匹配算法

    顯然,正則表達(dá)式、NFA、DFA的概念都很簡(jiǎn)單,所以直接上代碼,注釋?xiě)?yīng)該解釋地比較清楚, 沒(méi)有萬(wàn)能頭文件的自行替換需求庫(kù) ,如果有疑問(wèn)的可以留言。 網(wǎng)盤(pán)鏈接 [自行補(bǔ)全]/s/1pbGT_wpB662TwFrnukXgGQ?pwd=TSIT 提取碼:TSIT 原理可以參考這篇博客 傳送門(mén) 本次程序由四個(gè)文件組成 文

    2024年02月11日
    瀏覽(35)
  • 華為OD機(jī)試 - 數(shù)字字符串組合倒序 - 正則表達(dá)式(Java 2023 B卷 100分)

    華為OD機(jī)試 - 數(shù)字字符串組合倒序 - 正則表達(dá)式(Java 2023 B卷 100分)

    華為OD機(jī)試 2023B卷題庫(kù)瘋狂收錄中,刷題

    2024年02月09日
    瀏覽(25)
  • 算法訓(xùn)練day11Leetcode20有效的括號(hào)1047刪除字符串中所有相鄰重復(fù)項(xiàng)150逆波蘭表達(dá)式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判斷右括號(hào)后忘記pop 括號(hào)匹配是使用棧解決的經(jīng)典問(wèn)題。 如果還記得編譯原理的話,編譯器在 詞法分析的過(guò)程中處理括號(hào)、花括號(hào)等這個(gè)符號(hào)的邏輯,也是使用了棧

    2024年01月17日
    瀏覽(20)
  • 華為OD機(jī)試 - 提取字符串中的最長(zhǎng)合法簡(jiǎn)單數(shù)學(xué)表達(dá)式(Java & JS & Python & C)

    華為OD機(jī)試 - 提取字符串中的最長(zhǎng)合法簡(jiǎn)單數(shù)學(xué)表達(dá)式(Java & JS & Python & C)

    題目描述 提取字符串中的最長(zhǎng)合法簡(jiǎn)單數(shù)學(xué)表達(dá)式,字符串長(zhǎng)度最長(zhǎng)的,并計(jì)算表達(dá)式的值。如果沒(méi)有,則返回 0 。 簡(jiǎn)單數(shù)學(xué)表達(dá)式只能包含以下內(nèi)容: 0-9數(shù)字,符號(hào)+-* 說(shuō)明: 所有數(shù)字,計(jì)算結(jié)果都不超過(guò)long 如果有多個(gè)長(zhǎng)度一樣的,請(qǐng)返回第一個(gè)表達(dá)式的結(jié)果 數(shù)學(xué)表達(dá)

    2024年02月02日
    瀏覽(31)
  • 12.字符串和正則表達(dá)式

    正則表達(dá)式相關(guān)知識(shí) 在編寫(xiě)處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要,正則表達(dá)式就是用于描述這些規(guī)則的工具,換句話說(shuō)正則表達(dá)式是一種工具,它定義了字符串的匹配模式(如何檢查一個(gè)字符串是否有跟某種模式匹配的部分或者從一個(gè)

    2024年01月16日
    瀏覽(29)
  • 提取字符串中的最長(zhǎng)數(shù)學(xué)表達(dá)式并計(jì)算(67%用例) C卷(Java&&Python&&C++&&Node.js&&C語(yǔ)言)

    提取字符串中的最長(zhǎng)合法簡(jiǎn)單數(shù)學(xué)表達(dá)式,字符串長(zhǎng)度最長(zhǎng)的,并計(jì)算表達(dá)式的值。如果沒(méi)有,則返回0 簡(jiǎn)單數(shù)學(xué)表達(dá)式只能包含以下內(nèi)容 0-9數(shù)字,符號(hào)+-* 說(shuō)明: 1.所有數(shù)字,計(jì)算結(jié)果都不超過(guò)long 2.如果有多個(gè)長(zhǎng)度一樣的,請(qǐng)返回第一個(gè)表達(dá)式的結(jié)果 3.數(shù)學(xué)表達(dá)式,必須是最

    2024年04月13日
    瀏覽(21)
  • python 正則表達(dá)式提取字符串

    python 正則表達(dá)式提取字符串

    1、提取字符串的場(chǎng)景及公式、命令 背景 :目前遇到的場(chǎng)景主要是以某個(gè)字符串開(kāi)始、某個(gè)字符串結(jié)束,提取中間部分的字符,有的時(shí)候需要開(kāi)始的字符,有時(shí)不需要,大概涉及到了4種情況,場(chǎng)景及處理方式如下: 1.1 以某個(gè)字符開(kāi)始、某個(gè)字符結(jié)束,期待的提取結(jié)果 包含

    2024年02月02日
    瀏覽(26)
  • .NET實(shí)現(xiàn)解析字符串表達(dá)式

    我們創(chuàng)建了一個(gè) School 對(duì)象,其中包含了教師列表和學(xué)生列表?,F(xiàn)在,我們需要計(jì)算教師平均年齡和學(xué)生平均年齡。 如果我們將計(jì)算教師平均年齡的公式交給用戶定義,那么用戶可能會(huì)定義一個(gè)字符串來(lái)表示: Teachers.Sum(Age)/Teachers.Count 或者可以通過(guò)lambda來(lái)表示: teachers.Averag

    2023年04月21日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包