数据结构和算法——栈的面试算法

判断括号字符串是否合法?

我们的表达式中常常有一些括号包裹,编程语言语法检查的时候会判断括号是否匹配正确,常用的就是用栈结构。

"[[()]]" //合法
"{[)}" //不合法

算法思路:

1.遍历字符串,如果是左括号,就压入栈中,如果是右括号,就判断
2.判断的方法,首先看栈是否为空,如果为空,则说明字符串非法。再看看Pop()出来的元素是否与之配对,不配对就是非法,如果配对就进行下一循环。
3.字符串遍历完后,如果栈还是不为空,则说明字符串非法

func main(){
    str := "[[]"
    res := checkStr(str)
    fmt.Println(res)
}
func checkStr(str string) bool{
    stack := util.NewStack()
    charMap := map[string]string{")":"(", "]":"[", "}":"{"} //先定义配对的map,右括号为键
    str2 := []rune(str)
    for i:=0; i< len(str2); i++{
        char := string(str2[i])
        if value,ok := charMap[char]; !ok{ //如果是左括号,压入栈
            stack.Push(char)
        }else if stack.Len == 0 || (stack.Pop() != value){ //如果是右括号,判断弹出的字符是否与之匹配
            return false
        }
    }
    if stack.Len == 0 {
        return true
    }else{
        return false
    }
}

go使用切片来实现简单stack

//使用切片来实现栈
type Stack struct{
    Len int
    s []interface{}
}
func NewStack() *Stack{
    return &Stack{0,make([]interface{},0)}
}
func (stack *Stack)Pop() interface{}{
    if stack.Len == 0{
        return nil
    }else{
        res := stack.s[stack.Len-1] //获取栈顶元素
        stack.s = stack.s[:stack.Len-1] //删除栈顶元素
        stack.Len--
        return res
    }
}
func (stack *Stack)Push(data interface{}){
    defer func() {
        stack.Len++
    }()
    stack.s = append(stack.s, data)
}
func (stack *Stack)Print(){
    fmt.Println(stack.s)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
用过哪些工具?为啥用这个工具(速度快,支持高并发...)?底层如何实现的?
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!