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]
}
总结
- 三道题处理思路一致,使用切片模拟栈,一番进出栈操作后完成解题
- 增加元素即进栈,取出切片末尾元素后缩短切片长度即出栈
- 只操作切片末尾元素,即先进后出,可模拟栈
- 只操作切片首位元素,即先进先出,可模拟队列