通过栈实现对包含加减乘除的表达式的计算
stack
type Stack struct {
Cap int
Top int
Arr [20]int
}
func (s *Stack) Push(value int) {
if s.Top == s.Cap-1 {
fmt.Println("stack full!")
return
}
s.Top++
s.Arr[s.Top] = value
}
func (s *Stack) Pop() (value int) {
if s.Top == -1 {
fmt.Println("stack empty!")
return
}
value = s.Arr[s.Top]
s.Top--
return value
}
func (s *Stack) Show() {
if s.Top == -1 {
fmt.Println("stack empty!")
return
}
fmt.Println("栈的情况如下:")
for i := s.Top; i >= 0; i-- {
fmt.Printf("array[%d] = %v\n", i, s.Arr[i])
}
}
func (s *Stack) IsOper(value int) bool {
if value == 42 || value == 43 || value == 45 || value == 47 {
return true
} else {
return false
}
}
func (s *Stack) Calc(num1, num2 int, oper int) (ret int) {
switch oper {
case 42:
ret = num2 * num1
case 43:
ret = num2 + num1
case 45:
ret = num2 - num1
case 47:
ret = num2 / num1
default:
fmt.Println("error oper!")
}
return ret
}
func (s *Stack) Prio(oper int) (prio int) {
if oper == 42 || oper == 47 {
prio = 1
} else if oper == 43 || oper == 4 {
prio = 0
}
return prio
}
func Express(expression string) (calcRet int) {
numStack := &Stack{
Cap: 20,
Top: -1,
}
operStack := &Stack{
Cap: 20,
Top: -1,
}
index := 0
num1 := 0
num2 := 0
oper := 0
ret := 0
keepNum := ""
for {
expSingleString := expression[index : index+1]
tmp := int([]byte(expSingleString)[0])
if operStack.IsOper(tmp) {
if operStack.Top == -1 {
operStack.Push(tmp)
} else {
if operStack.Prio(operStack.Arr[operStack.Top]) >= operStack.Prio(tmp) {
num1 = numStack.Pop()
num2 = numStack.Pop()
oper = operStack.Pop()
ret = operStack.Calc(num1, num2, oper)
numStack.Push(ret)
operStack.Push(tmp)
} else {
operStack.Push(tmp)
}
}
} else {
keepNum += expSingleString
if index == len(expression)-1 {
value, _ := strconv.Atoi(keepNum)
numStack.Push(value)
} else {
if operStack.IsOper(int([]byte(expression[index+1 : index+2])[0])) {
value, _ := strconv.Atoi(keepNum)
numStack.Push(value)
keepNum = ""
}
}
}
if index+1 == len(expression) {
break
}
index++
}
for {
if operStack.Top == -1 {
break
}
num1 = numStack.Pop()
num2 = numStack.Pop()
oper = operStack.Pop()
ret = operStack.Calc(num1, num2, oper)
numStack.Push(ret)
}
return numStack.Pop()
}
main
func main() {
expression := "100+2+5*6+9/3"
ret := stack.Express(expression)
fmt.Printf("[%v] = %v\n", expression, ret)
}