Go語言用棧實現算術運算式

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

將中序運算式轉成後序運算式,再通過後序運算式計算出值。

package main//運算式//author:Xiong Chuan Liang//date:2015-2-2import ("fmt""github.com/xcltapestry/xclpkg/algorithm"  "strconv""errors")func main(){// 中序運算式       後序運算式// a+b            = ab+// (a+b)/c        = ab+c/// a+b*(c+d)      = abcd+*+// a*b+c*(d-e)/f  = ab*cde-*f/+//str := "a*b+c*(d-e)/f"//str := "1*2+3*(4-5)/6"str := "1*2+3*(5-1)/2"exp,err := ExpConvert(str)if err != nil {fmt.Println("中序運算式轉後序運算式失敗! ",err)}else{Exp(exp)}//v := 1*2+3*(4-5)/6v := 1*2+3*(5-1)/2fmt.Println("標準結果: ",v)}func ExpConvert(str string)(string,error){var result stringstack := algorithm.NewStack()for _,s := range str {ch := string(s)if IsOperator(ch) { //是運算子if stack.Empty() || ch == "(" {stack.Push(ch)}else{if ch == ")" { //處理括弧for{if stack.Empty() {return "",errors.New("運算式有問題! 沒有找到對應的\"(\"號") }if stack.Top().(string) == "(" {break}result += stack.Top().(string)stack.Pop()}//彈出"("stack.Top()stack.Pop()}else{ //非括弧 //比較優先順序  for{ if stack.Empty() { break } m := stack.Top().(string) if Priority(ch) > Priority(m) { break } result += m stack.Pop()  } stack.Push(ch)}}}else{//非運算子result += ch} //end IsOperator()} //end for range strfor {if stack.Empty() { break }result += stack.Top().(string)stack.Pop()}fmt.Println("ExpConvert() str    = ",str )fmt.Println("ExpConvert() result = ",result)return result,nil}func Exp(str string){fmt.Println("\nCalc \nExp() :",str )stack := algorithm.NewStack()for _,s := range str {ch := string(s)if IsOperator(ch) { //是運算子if stack.Empty() {break}b := stack.Top().(string)stack.Pop()a := stack.Top().(string)stack.Pop()ia,ib := convToInt32(a,b)sv := fmt.Sprintf("%d",Calc(ch,ia,ib))stack.Push( sv )fmt.Println("Exp() ",a,"",ch,"",b,"=",sv)}else{stack.Push(ch)fmt.Println("Exp() ch: ",ch)} //end IsOperator}//stack.Print()if !stack.Empty() {fmt.Println("運算式運算結果: ", stack.Top() )stack.Pop()}}func convToInt32(a,b string)(int32,int32){ia, erra := strconv.ParseInt(a, 10, 32)  if erra != nil { panic(erra)  }ib, errb := strconv.ParseInt(b, 10, 32)  if errb != nil { panic(errb) }return int32(ia),int32(ib)}func IsOperator(op string)(bool){switch(op){case "(",")","+","-","*","/":return truedefault:return false}}func Priority(op string)(int){switch(op){case "*","/":return 3case "+","-":return 2case "(":return 1default:return 0}}func Calc(op string,a,b int32)(int32){switch(op){case "*":return (a * b)case "/":return (a / b)case "+":return (a + b)case "-":return (a - b)default:return 0}}

運算結果:  

ExpConvert() str    =  1*2+3*(5-1)/2ExpConvert() result =  12*351-*2/+CalcExp() : 12*351-*2/+Exp() ch:  1Exp() ch:  2Exp()  1  *  2 = 2Exp() ch:  3Exp() ch:  5Exp() ch:  1Exp()  5  -  1 = 4Exp()  3  *  4 = 12Exp() ch:  2Exp()  12  /  2 = 6Exp()  2  +  6 = 8運算式運算結果:  8標準結果:  8



MAIL: xcl_168@aliyun.com

BLOG:http://blog.csdn/net/xcl168






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.