文章目录
栈之基础题目
1.有效的括号
1.1栈
func isValid(s string) bool {
if len(s)%2 == 1 {
return false
}
stack := make([]byte, 0)
for i := 0; i < len(s); i++ {
if s[i] == '(' {
stack = append(stack, ')')
} else if s[i] == '[' {
stack = append(stack, ']')
} else if s[i] == '{' {
stack = append(stack, '}')
} else if len(stack) == 0 || stack[len(stack)-1] != s[i] {
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
return false
} else {
stack = stack[:len(stack)-1] // st.top() 与 s[i]相等,栈弹出元素
}
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return len(stack) == 0
}
20.有效的括号
2.删除字符串中的所有相邻重复项
2.1栈
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] {
// 弹出栈顶元素 并 忽略当前元素(s[i])
stack = stack[:len(stack)-1]
}else{
// 入栈
stack = append(stack, s[i])
}
}
return string(stack)
}
1047.删除字符串中的所有相邻重复项
3.逆波兰表达式求值
3.1栈
func evalRPN(tokens []string) int {
stack := []int{}
for i := 0; i < len(tokens); i++ {
if tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/" {
num1, num2 := stack[len(stack)-2], stack[(len(stack))-1] //栈的倒数第一个元素与倒数第二个元素
stack = stack[:len(stack)-2] //去掉栈的倒数第一个元素与倒数第二个元素
switch tokens[i] {
case "+":
stack = append(stack, num1+num2)
case "-":
stack = append(stack, num1-num2)
case "*":
stack = append(stack, num1*num2)
case "/":
stack = append(stack, num1/num2)
}
} else {
v, _ := strconv.Atoi(tokens[i])
stack = append(stack, v)
}
}
return stack[0] //最终栈只会有一个元素
}
150.逆波兰表达式求值