- 代码随想录 (programmercarl.com)
-
第一印象
- 这题是利用栈的特性,遇到左括号就压入,遇到右括号就弹出,还要注意不成立状况的逻辑。
-
解题代码
- 全展开逻辑
-
func isValid(s string) bool {
if len(s) % 2 != 0 {
return false
}
st := make([]byte,0)
for i:=0;i<len(s);i++ {
if s[i] == '(' {
st = append(st, s[i])
continue
}
if s[i] == '[' {
st = append(st, s[i])
continue
}
if s[i] == '{' {
st = append(st, s[i])
continue
}
if s[i] == ')' {
if len(st)>0 {
if st[len(st)-1] == '(' {
st = st[:len(st)-1]
continue
} else {
return false
}
} else {
return false
}
}
if s[i] == '}' {
if len(st)>0 {
if st[len(st)-1] == '{' {
st = st[:len(st)-1]
continue
} else {
return false
}
} else {
return false
}
}
if s[i] == ']' {
if len(st)>0 {
if st[len(st)-1] == '[' {
st = st[:len(st)-1]
continue
} else {
return false
}
} else {
return false
}
}
}
return len(st) == 0
}
- 利用map精简代码
-
func isValid(s string) bool {
hash := map[byte]byte{')':'(', ']':'[', '}':'{'}
stack := make([]byte, 0)
if s == "" {
return true
}
for i := 0; i < len(s); i++ {
if s[i] == '(' || s[i] == '[' || s[i] == '{' {
stack = append(stack, s[i])
} else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] {
stack = stack[:len(stack)-1]
} else {
return false
}
}
return len(stack) == 0
}
-
-
1047.删除字符串中的所有相邻重复项
- 代码随想录 (programmercarl.com)
-
第一印象
- 这题同”有效的括号“,是利用栈的特性进行匹配,最后留在栈里的字母就是应返回值。
-
解题代码
-
func removeDuplicates(s string) string {
st := []byte{}
for i:=0;i<len(s);i++{
if len(st)>0 && s[i] == st[len(st)-1] {
st = st[:len(st)-1]
} else {
st = append(st, s[i])
}
}
return string(st)
}
-
150逆波兰表达式
- 代码随想录 (programmercarl.com)
-
第一印象
- 后缀表达式的算法,利用栈来实现的过程就是遇到数值进行压入,遇到符号弹出前面两个值,运算后再压回。最后返回栈内值。
-
解题代码及要点
- 要注意字符与数字的转换,方便运算
- golang中可以利用类型转换函数的err值来判断字符中是数字还是符号
- 要注意运算时num1应是num2后弹出的。不然除法不正确
- 利用swich语句
-
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]
}