雙棧表達(dá)式求值算法:支持小數(shù)點(diǎn),負(fù)數(shù),括號(hào),乘方運(yùn)算

增加支持小數(shù)點(diǎn)没咙、負(fù)數(shù)猩谊、括號(hào)、乘方運(yùn)算祭刚。

    //雙棧表達(dá)式求值算法
private String stackCalculate(String str){
    //記錄小數(shù)點(diǎn)索引位置
    int dotIndex = 0;
    //記錄是否存在負(fù)號(hào)
    boolean negative = false;

    Stack<String> ops = new Stack<String>();
    Stack<Double> vals = new Stack<Double>();
    if (!str.isEmpty()){
        for (int i = 0;i < str.length();i++) {
            String temp = String.valueOf(str.charAt(i));
            if (temp.equals("(")) {
                ;
            } else if (temp.equals("+")) {
                ops.push("+");
            } else if (temp.equals("-")) {
                ops.push("-");
            } else if (temp.equals("×")) {
                ops.push("*");
            } else if (temp.equals("÷")) {
                ops.push("/");
            } else if (temp.equals("√")) {
                ops.push(temp);
            } else if (temp.equals("^")) {
                ops.push(temp);
            } else if (temp.equals(")")) {
                String rop = ops.pop();
                double v = vals.pop();
                if (rop.equals("+")) v = vals.pop() + v;
                else if (rop.equals("-")) v = vals.pop() - v;
                else if (rop.equals("*")) v = vals.pop() * v;
                else if (rop.equals("/")) v = vals.pop() / v;
                else if (rop.equals("√")) v = Math.sqrt(v);
                else if (rop.equals("^")) v = Math.pow(vals.pop(),v);
                vals.push(v);
            } else if (temp.equals("-")) {
                //存在負(fù)號(hào)
                negative = true;
            } else if (temp.equals(".")){
                //保存小數(shù)點(diǎn)索引
                dotIndex = i;
            } else {
                //處理小數(shù)
                if (dotIndex > 0){
                    double v = Integer.parseInt(temp) * Math.pow(10, -(i - dotIndex));
                    double p = vals.pop();
                    if (p < 0){
                        vals.push(-(-p + v));
                    } else {
                        vals.push(p + v);
                    }

                    if (i+1 < str.length()){
                        if (!Character.isDigit(str.charAt(i+1))){
                            if (negative == true){
                                double np = vals.pop();
                                vals.push(-np);
                                negative = false;
                            }
                            dotIndex = 0;
                        }
                    }
                    continue;
                }

                //若操作數(shù)棧不為空
                if (i-1 >= 0){
                    //操作多位數(shù)
                    if (Character.isDigit(str.charAt(i - 1))) {
                        int p = 0;
                        if (!vals.isEmpty()) {
                            p = vals.pop().intValue();
                        }
                        if (p < 0) {
                            p = -p;
                        }
                        double t = p * 10 + Integer.parseInt(temp);
                        if (negative == true) {
                            vals.push(-t);
                            if (i+1 < str.length()){
                                //下一位非數(shù)字
                                if (!Character.isDigit(str.charAt(i+1))){
                                    negative = false;
                                }
                                //已到達(dá)最后一個(gè)字符
                            } else {
                                negative = false;
                            }
                        } else {
                            vals.push(t);
                        }
                    //非多位數(shù)
                    } else {
                        if (negative == true){
                            vals.push(-Double.parseDouble(temp));
                            //不含小數(shù)點(diǎn)或已處理完小數(shù)點(diǎn)
                            if (dotIndex == 0){
                                if (i+1 < str.length()){
                                    //下一位非數(shù)字
                                    if (!Character.isDigit(str.charAt(i+1))){
                                        negative = false;
                                    }
                                    //已到達(dá)最后一個(gè)字符
                                } else {
                                    negative = false;
                                }
                            }
                        } else {
                            vals.push(Double.parseDouble(temp));
                        }
                    }
                //若操作數(shù)棧為空
                } else {
                    if (negative == true){
                        vals.push(-Double.parseDouble(temp));
                        //不含小數(shù)點(diǎn)或已處理完小數(shù)點(diǎn)
                        if (dotIndex == 0){
                            if (i+1 < str.length()){
                                //下一位非數(shù)字
                                if (!Character.isDigit(str.charAt(i+1))){
                                    negative = false;
                                }
                                //已到達(dá)最后一個(gè)字符
                            } else {
                                negative = false;
                            }
                        }
                    } else {
                        vals.push(Double.parseDouble(temp));
                    }
                }
            }
        }

        //最后牌捷,若表達(dá)式中不含括號(hào)墙牌,也要執(zhí)行計(jì)算
        while (!ops.isEmpty() && !vals.isEmpty()){
            String rop = ops.pop();
            double v = vals.pop();
            if (rop.equals("+")) {
                v = vals.pop() + v;
            } else if (rop.equals("-")){
                v = vals.pop() - v;
            } else if (rop.equals("*")){
                v = vals.pop() * v;
            } else if (rop.equals("/")){
                v = vals.pop() / v;
            } else if (rop.equals("√")){
                v = Math.sqrt(v);
            } else if (rop.equals("^")){
                v = Math.pow(vals.pop(),v);
            }
            vals.push(v);
        }
    }
    return String.valueOf(vals.pop());
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暗甥,隨后出現(xiàn)的幾起案子喜滨,更是在濱河造成了極大的恐慌,老刑警劉巖撤防,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽风,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寄月,警方通過(guò)查閱死者的電腦和手機(jī)辜膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漾肮,“玉大人厂抖,你說(shuō)我怎么就攤上這事】税茫” “怎么了忱辅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谭溉。 經(jīng)常有香客問(wèn)我墙懂,道長(zhǎng),這世上最難降的妖魔是什么夜只? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任垒在,我火速辦了婚禮,結(jié)果婚禮上扔亥,老公的妹妹穿的比我還像新娘场躯。我一直安慰自己,他們只是感情好旅挤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布踢关。 她就那樣靜靜地躺著,像睡著了一般粘茄。 火紅的嫁衣襯著肌膚如雪签舞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天柒瓣,我揣著相機(jī)與錄音儒搭,去河邊找鬼。 笑死芙贫,一個(gè)胖子當(dāng)著我的面吹牛搂鲫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磺平,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼魂仍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拐辽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起擦酌,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俱诸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赊舶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睁搭,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锯岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了介袜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡出吹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辙喂,到底是詐尸還是另有隱情捶牢,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布巍耗,位于F島的核電站秋麸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炬太。R本人自食惡果不足惜灸蟆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亲族。 院中可真熱鬧炒考,春花似錦、人聲如沸霎迫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)知给。三九已至瓤帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涩赢,已是汗流浹背戈次。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筒扒,地道東北人怯邪。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像霎肯,于是被迫代替她去往敵國(guó)和親擎颖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榛斯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容