逆波兰表达式
// 中缀转后缀
func pre2Post() *[]string {
slice := strings.Split("")
stack := Stack.NewStack(20)
var slice2 []string
for _, val := range slice {
if isOperation(val) {
if (val != ")") {
now := stack.GetValue()
if now == "+" || now == "-" {
stack.Push(val)
} else {
var popEle string
stack.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 int
stack.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 - b
case "+":
return a + b
case "*":
return a * b
case "/":
return a / b
default:
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)将得到结果入栈