2019-01-31

LeetCode 27. Basic Calculator II.jpg

LeetCode 27. Basic Calculator II

Description

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

Example 1:

Input: "3+2*2"
Output: 7
Example 2:

Input: " 3/2 "
Output: 1
Example 3:

Input: " 3+5 / 2 "
Output: 5
Note:

You may assume that the given expression is always valid.
Do not use the eval built-in library function.

描述

實現(xiàn)一個基本的計算器來計算一個簡單的字符串表達式的值舀凛。

字符串表達式僅包含非負整數(shù)召衔,+, - 捷犹,*恳谎,/ 四種運算符和空格 肥荔。 整數(shù)除法僅保留整數(shù)部分骇两。

示例 1:

輸入: "3+2*2"
輸出: 7
示例 2:

輸入: " 3/2 "
輸出: 1
示例 3:

輸入: " 3+5 / 2 "
輸出: 5
說明:

你可以假設所給定的表達式都是有效的。
請不要使用內(nèi)置的庫函數(shù) eval拳喻。

思路

  • 我們使用兩個棧來實現(xiàn)表達式求值.
  • 其中一個用來存儲數(shù)字哭当,另一個來存儲符號.
  • 我們從給定的字符串中不斷的取出數(shù)字和符號,若是數(shù)字冗澈,我們將其壓入數(shù)字棧钦勘,如果是符號,我們和當前棧頂?shù)姆栠M行比較渗柿,如果當前符號的優(yōu)先級小于等于棧頂元素的符號个盆,我們彈出符號棧頂元素,并用此符號對數(shù)字棧棧頂?shù)膬蓚€元素進行運算朵栖,并將運算的結果重新壓入數(shù)字棧颊亮,直到當前符號大于符號棧棧頂元素或者符號棧為空.
# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-28 20:41:10
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-28 21:28:48


class Solution:
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 聲明兩個棧,用于存儲數(shù)字和操作符
        stack1, stack2 = [], []
        # num用于從字符串中取出數(shù)字
        num = 0
        for item in s:
            # 取數(shù)字
            if item.isdigit():
                num = num * 10 + ord(item) - ord("0")
            # 如果為空則繼續(xù)執(zhí)行
            elif item == " ":
                continue
            else:
                # 向數(shù)字棧中添加數(shù)字
                stack1.append(num)
                # 數(shù)字重置為0
                num = 0
                # 如果符號棧為空陨溅,將當前符號壓入棧
                if not stack2:
                    stack2.append(item)
                else:
                    # 如果當前操作符優(yōu)先級小于等于符號棧棧頂操作符终惑,我們持續(xù)進行運算
                    while stack2 and self.compare(stack2[-1], item):
                        # 從數(shù)字棧中取出兩個數(shù)字
                        num1, num2 = stack1.pop(), stack1.pop()
                        # 對這兩個數(shù)字進行當前符號的運算,并將運算結果壓入數(shù)字棧
                        stack1.append(self.operate(stack2.pop(), num2, num1))
                    # 將當前符號壓入符號棧
                    stack2.append(item)
        # 將最后剩下的數(shù)字壓入數(shù)子棧
        stack1.append(num)
        # 對剩下的數(shù)字和符號進行運算
        while stack2 and stack1:
            num1, num2 = stack1.pop(), stack1.pop()
            stack1.append(self.operate(stack2.pop(), num2, num1))
        return stack1.pop()

    def operate(self, operator, num1, num2):
        # 運算函數(shù)
        if operator == "+": return num1 + num2
        if operator == "-": return num1 - num2
        if operator == "*": return num1 * num2
        if operator == "/": return num1 // num2

    def compare(self, op1, op2):
        # op2的優(yōu)先級>=op1的優(yōu)先級返回True
        # 否則返回False
        if (op1 == "+" or op1 == "-") and (op2 == '+' or op2 == "-"):
            return True
        if (op1 == "*" or op1 == "/") and (op2 == '*' or op2 == '/'):
            return True
        if (op1 == "*" or op1 == "/") and (op2 == '+' or op2 == "-"):
            return True
        return False

源代碼文件在這里.
?本文首發(fā)于何睿的博客门扇,歡迎轉載雹有,轉載需保留文章來源偿渡,作者信息和本聲明.

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霸奕,隨后出現(xiàn)的幾起案子溜宽,更是在濱河造成了極大的恐慌,老刑警劉巖质帅,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适揉,死亡現(xiàn)場離奇詭異,居然都是意外死亡煤惩,警方通過查閱死者的電腦和手機嫉嘀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魄揉,“玉大人剪侮,你說我怎么就攤上這事÷逋耍” “怎么了瓣俯?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長不狮。 經(jīng)常有香客問我降铸,道長,這世上最難降的妖魔是什么摇零? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮桶蝎,結果婚禮上驻仅,老公的妹妹穿的比我還像新娘。我一直安慰自己登渣,他們只是感情好噪服,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胜茧,像睡著了一般粘优。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呻顽,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天雹顺,我揣著相機與錄音,去河邊找鬼廊遍。 笑死嬉愧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喉前。 我是一名探鬼主播没酣,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王财,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裕便?” 一聲冷哼從身側響起绒净,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偿衰,沒想到半個月后疯溺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哎垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年囱嫩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏设。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡墨闲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郑口,到底是詐尸還是另有隱情鸳碧,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布犬性,位于F島的核電站瞻离,受9級特大地震影響,放射性物質發(fā)生泄漏乒裆。R本人自食惡果不足惜套利,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹤耍。 院中可真熱鬧肉迫,春花似錦、人聲如沸稿黄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杆怕。三九已至族购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陵珍,已是汗流浹背寝杖。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撑教,地道東北人朝墩。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親收苏。 傳聞我的和親對象是個殘疾皇子亿卤,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,793評論 0 38
  • 想要知道你的牌是什么排吴?如何更愉快地和愛人相處及理解?彼此?點贊加我wx:Sophiannn懦鼠,給你準備了大禮包「每天...
    虹姐談情緒管理閱讀 360評論 1 2
  • 引言 在應用中钻哩,當某些業(yè)務數(shù)據(jù)量過大時會導致數(shù)據(jù)庫讀寫性能急劇下降甚至拖慢其它業(yè)務的情況。此時便需要對數(shù)據(jù)庫進行不...
    PKAQ閱讀 11,254評論 16 11
  • 牽引力教育女生到底適不適合學IT 一提到編程肛冶、計算機街氢、工程師等字眼,大家腦海里就浮現(xiàn)出「工科男」睦袖、「程序猿」等形象...
    大大大西瓜666閱讀 207評論 0 0
  • 前言 在游戲中珊肃,我們經(jīng)常想要找到從一個位置到另一個位置的路徑。我們不僅試圖找到最短的距離;我們還想考慮旅行時間馅笙。要...
    Huws閱讀 1,489評論 0 0