代码随想录day11

150. 逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。

//思路 符号栈 数字栈
//每次pop 符号栈数字栈的元素进行运算
// 21 +  运算完后结果入栈
//如果符号栈为空 则弹出数字栈结果

//优化 符号不需要栈,因为符号一直在最后面,遇到符号直接弹出两个即可

func evalRPN(tokens []string) int {
    st:=[]int{}
    for _,token := range tokens{
        val,err:= strconv.Atoi(token)
        if err  ==nil{
            st = append(st,val)
        }else{
            num1,num2:= st[len(st)-2],st[len(st)-1]
            st = st[:len(st)-2]


            switch token {
                case "+":
                    st = append(st,num1 + num2)
                case "-":
                    st = append(st,num1 - num2)
                case "*":
                    st = append(st,num1 * num2)
                case "/":
                    st = append(st,num1 / num2)
            }
        }
    }
    return st[0]
}

1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

//思路 巧用切片作为栈结构
//如果当前元素与栈顶元素相同 则消去该元素
//如果当前元素与栈顶元素不同,则入栈
//重复即可
func removeDuplicates(s string) string {
    st:= []byte{}
    for i:= range s{
        if len(st)>0 && st[len(st)-1] ==s[i]{
            st =st[:len(st)-1]
        }else{
            st=append(st,s[i])
        }
    }
    return string(st)
}


20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

func isValid(s string) bool {
    st:= list.New()


    for _,v := range s{
        if v =='{'{
            st.PushBack('}')
        }else if v =='('{
            st.PushBack(')')
        }else if v =='['{
            st.PushBack(']')
        }else if st.Len() == 0 || st.Remove(st.Back())!= int32(v){
            return false//因为如果是合法的那就是对称的,如果遍历的右部分字符 不等于栈内字符的话,就说明有异常
        }
    }
    return st.Len() ==0
}


 

你可能感兴趣的:(算法)