ruby計(jì)算器

#coding:utf-8
require "stringio"

def log(*args)
    # puts args.join(" ")
end

class Calculator
    Symbol = ["+", "-", "*", "/", "(", ")"]
    public
    def calcExpr(text)
        symbol = Calculator::Symbol
        symbol_array = []
        number_array = []
        text.gsub! "\x20", ""

        log text
        io = StringIO.new text
        until io.eof?
            ch = io.getc
            if isdigit ch
                io.ungetc ch
                number_array.push (peek_number io)
            elsif ch == '('
                # push stack
                symbol_array.push ch
            elsif ch == ")"
                # pop
                while symbol_array.size>0
                    op = symbol_array.pop
                    if op =="("
                        break
                    end
                    op1 = number_array.pop
                    op2 = number_array.pop
                    
                    log "#{op1} #{op2} #{op}"
                    number_array.push calc(op1, op2, op)
                end
            elsif symbol.include? ch
                # stack top
                while symbol_array.size > 0
                    if compare_symbol symbol_array[-1], ch
                        op1 = number_array.pop
                        op2 = number_array.pop
                        sy = symbol_array.pop
                        log "#{op1} #{op2} #{sy}"
                        number_array.push calc(op1, op2, sy)
                    else
                        break
                    end
                end
                symbol_array.push ch    
            end
        end
        while symbol_array.size>0
            op1 = number_array.pop
            op2 = number_array.pop
            sy = symbol_array.pop
            log "#{op1} #{op2} #{sy}"
            number_array.push calc(op1, op2, sy)
        end
        if number_array.size>0
            number_array[0]
        else
            puts "wrong"
        end


    end
    private
    def isdigit(c)
        (c =~ /\d/) == 0
    end
    def compare_symbol s1, s2
        if s2 == "+" || s2 =="-"    
            if (s1 == "*" || s1 == "/")
                return true
            end
        end
        return false
    end
    # TODO:// exception
    def calc(op1, op2, op)
        case op
        when "+"
            return op1+op2
        when "-"
            return op1-op2
        when "*"
            return op1*op2
        when "/"
            return op1/op2
        end
    end

    def is_float(number)
        (number =~ /\d+.\d+/) == 0
    end

    def peek_number (io)
        number = ""
        until io.eof?
            ch = io.getc
            if isdigit(ch) ||  (ch == ".")
                number << ch
            else
                io.ungetc ch
                break
            end
        end
        
        if is_float number
            number.to_f
        else
            number.to_i
        end
    end

end

c = Calculator.new
r = c.calcExpr "(2+2)*10+9+8*200"
puts "result:#{r}"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞋既,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耍铜,更是在濱河造成了極大的恐慌邑闺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕兼,死亡現(xiàn)場(chǎng)離奇詭異陡舅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伴挚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門靶衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾炭,“玉大人,你說我怎么就攤上這事颅眶◎诔觯” “怎么了爷速?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵膏孟,是天一觀的道長(zhǎng)再层。 經(jīng)常有香客問我雄右,道長(zhǎng)库糠,這世上最難降的妖魔是什么钮追? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任怒炸,我火速辦了婚禮隅俘,結(jié)果婚禮上沈自,老公的妹妹穿的比我還像新娘酌儒。我一直安慰自己,他們只是感情好枯途,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布忌怎。 她就那樣靜靜地躺著,像睡著了一般酪夷。 火紅的嫁衣襯著肌膚如雪榴啸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天晚岭,我揣著相機(jī)與錄音鸥印,去河邊找鬼。 笑死坦报,一個(gè)胖子當(dāng)著我的面吹牛库说,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播片择,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼潜的,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了字管?” 一聲冷哼從身側(cè)響起啰挪,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘲叔,沒想到半個(gè)月后脐供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡借跪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌壕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掏愁。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歇由,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出果港,到底是詐尸還是另有隱情沦泌,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布辛掠,位于F島的核電站谢谦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏萝衩。R本人自食惡果不足惜回挽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猩谊。 院中可真熱鬧千劈,春花似錦、人聲如沸牌捷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暗甥。三九已至喜滨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撤防,已是汗流浹背虽风。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留即碗,地道東北人焰情。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剥懒,于是被迫代替她去往敵國和親内舟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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