逆波兰表达式
// 中缀转后缀func pre2Post() *[]string {slice := strings.Split("")stack := Stack.NewStack(20)var slice2 []stringfor _, val := range slice {if isOperation(val) {if (val != ")") {now := stack.GetValue()if now == "+" || now == "-" {stack.Push(val)} else {var popEle stringstack.Pop(&popEle)slice2 = append(slice2, popEle)}} else {for ele := stack.Pop(&ele); ele != "(" {slice2 = append(slice2, ele)}}} else {slice2 = append(slice2, val)}}}// 后缀表达式func postFun() {nums := []string{"9", "3", "1", "-", "3", "*", "+", "10", "2", "/", "+"}stack := Stack.NewStack(20)for _, val := range nums {if isOperation(val) {var prev, next intstack.Pop(&next)stack.Pop(&prev)result := operation(prev, next, val)stack.Push(result)} else {num, _ := strconv.Atoi(val)stack.Push(num)}}fmt.Println(stack.GetValue())}// 辅助方法func operation(a, b int, opt string) int {switch opt {case "-":return a - bcase "+":return a + bcase "*":return a * bcase "/":return a / bdefault:panic("wrong operation")}}func isOperation(str string) bool {slice := []string{"+", "-", "*", "/"}for _, val := range slice {if val == str {return true}}return false}
没有泛型是真的不方便
中缀表达式 (栈用来进出运算的符号)
- 定义当前元素 ele
- 数字类型直接输出
- 遇到 ( 进栈 遇到 ) 开始出栈输出,直到 ( 出栈为止
- 如果当前栈顶元素 比 ele 优先级低 (“* /“ < “+ -“),入栈
- 如果当前栈顶元素 比 ele 优先级高 (如果栈顶), 则出栈所有栈中元素,直到栈空, 然后将当前元素入栈
- 如果当前栈顶元素 和 ele 优先级相等, 输出当前元素
- 当前元素为 nil 后,出栈输出到队尾
后缀表达式 (栈用来进出运算的数字)
- 定义当前元素 ele
- 如果 ele 是数字类型入栈
- 如果 ele 是运算符类型 出栈两个元素(一定是数字类型), 第一个出栈的元素为b, 第二个出栈的元素为a, (a opt b)将得到结果入栈
