代码随想录算法训练营Day11 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

51 阅读1分钟

LeetCode题目

20.有效的括号

题目链接:Valid Parentheses - LeetCode

代码如下:

func isValid(s string) bool {
	stack := make([]rune, 0)

	m := make(map[rune]rune)
	m[')'] = '('
	m[']'] = '['
	m['}'] = '{'

	for _, c := range s {
		if c == '(' || c == '[' || c == '{' {
			stack = append(stack, c)
		} else {
			if len(stack) == 0 {
				return false
			}

			peek := stack[len(stack)-1]
			if peek != m[c] {
				return false
			}

			stack = stack[:len(stack)-1]
		}
	}

	return len(stack) == 0
}

1047.删除字符串中的所有相邻重复项

题目链接:Remove All Adjacent Duplicates In String - LeetCode

代码如下:

func removeDuplicates(s string) string {
	var stack []byte
	for i := 0; i < len(s); i++ {
		if len(stack) > 0 && stack[len(stack)-1] == s[i] {
			stack = stack[:len(stack)-1]
		} else {
			stack = append(stack, s[i])
		}
	}
	return string(stack)
}

150.逆波兰表达式求值

题目链接:Evaluate Reverse Polish Notation - LeetCode

代码如下:

func evalRPN(tokens []string) int {
	stack := []int{}
	for _, token := range tokens {
		val, err := strconv.Atoi(token)
		if err == nil {
			stack = append(stack, val)
		} else {
			num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
			stack = stack[:len(stack)-2]
			switch token {
			case "+":
				stack = append(stack, num1+num2)
			case "-":
				stack = append(stack, num1-num2)
			case "*":
				stack = append(stack, num1*num2)
			case "/":
				stack = append(stack, num1/num2)
			}
		}
	}
	return stack[0]
}

总结

  1. 三道题处理思路一致,使用切片模拟栈,一番进出栈操作后完成解题
  2. 增加元素即进栈,取出切片末尾元素后缩短切片长度即出栈
  3. 只操作切片末尾元素,即先进后出,可模拟栈
  4. 只操作切片首位元素,即先进先出,可模拟队列