這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
將中序運算式轉成後序運算式,再通過後序運算式計算出值。
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