逆波兰表达式

  1. // 中缀转后缀
  2. func pre2Post() *[]string {
  3. slice := strings.Split("")
  4. stack := Stack.NewStack(20)
  5. var slice2 []string
  6. for _, val := range slice {
  7. if isOperation(val) {
  8. if (val != ")") {
  9. now := stack.GetValue()
  10. if now == "+" || now == "-" {
  11. stack.Push(val)
  12. } else {
  13. var popEle string
  14. stack.Pop(&popEle)
  15. slice2 = append(slice2, popEle)
  16. }
  17. } else {
  18. for ele := stack.Pop(&ele); ele != "(" {
  19. slice2 = append(slice2, ele)
  20. }
  21. }
  22. } else {
  23. slice2 = append(slice2, val)
  24. }
  25. }
  26. }
  27. // 后缀表达式
  28. func postFun() {
  29. nums := []string{"9", "3", "1", "-", "3", "*", "+", "10", "2", "/", "+"}
  30. stack := Stack.NewStack(20)
  31. for _, val := range nums {
  32. if isOperation(val) {
  33. var prev, next int
  34. stack.Pop(&next)
  35. stack.Pop(&prev)
  36. result := operation(prev, next, val)
  37. stack.Push(result)
  38. } else {
  39. num, _ := strconv.Atoi(val)
  40. stack.Push(num)
  41. }
  42. }
  43. fmt.Println(stack.GetValue())
  44. }
  45. // 辅助方法
  46. func operation(a, b int, opt string) int {
  47. switch opt {
  48. case "-":
  49. return a - b
  50. case "+":
  51. return a + b
  52. case "*":
  53. return a * b
  54. case "/":
  55. return a / b
  56. default:
  57. panic("wrong operation")
  58. }
  59. }
  60. func isOperation(str string) bool {
  61. slice := []string{"+", "-", "*", "/"}
  62. for _, val := range slice {
  63. if val == str {
  64. return true
  65. }
  66. }
  67. return false
  68. }

没有泛型是真的不方便

中缀表达式 (栈用来进出运算的符号)

  • 定义当前元素 ele
  • 数字类型直接输出
  • 遇到 ( 进栈 遇到 ) 开始出栈输出,直到 ( 出栈为止
  • 如果当前栈顶元素 比 ele 优先级低 (“* /“ < “+ -“),入栈
  • 如果当前栈顶元素 比 ele 优先级高 (如果栈顶), 则出栈所有栈中元素,直到栈空, 然后将当前元素入栈
  • 如果当前栈顶元素 和 ele 优先级相等, 输出当前元素
  • 当前元素为 nil 后,出栈输出到队尾

后缀表达式 (栈用来进出运算的数字)

  • 定义当前元素 ele
  • 如果 ele 是数字类型入栈
  • 如果 ele 是运算符类型 出栈两个元素(一定是数字类型), 第一个出栈的元素为b, 第二个出栈的元素为a, (a opt b)将得到结果入栈