力扣 数据结构基础(5)

104 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

19.有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

 

有效字符串需满足:

 

    左括号必须用相同类型的右括号闭合。

    左括号必须以正确的顺序闭合。

找了个比较好理解的

class Solution {
public:
    bool isValid(string s) {
        stack<char>stk;
        if(s.empty()){
            return true;
        }
        for(auto c :s){
            //左括号入栈
            if(c=='(' || c=='[' || c=='{'){
                stk.push(c);
            }
            //右括号:三种情况
            //1.栈为空,false
            //2.与栈顶元素不匹配,false
            //3.与栈顶元素匹配,true,并将栈顶元素出栈
            else{
                if(stk.empty()){
                    return false;
                }
                else{
                    if(c==')'){
                        if(stk.top()!='('){
                            return false;
                        }
                        else{
                            stk.pop();
                        }
                    }
                    else if(c==']'){
                        if(stk.top()!='['){
                            return false;
                        }
                        else{
                            stk.pop();
                        }
                    }
                    else if(c=='}'){
                        if(stk.top()!='{'){
                            return false;
                        }
                        else{
                            stk.pop();
                        }
                    }
                }
            }
        }
        return stk.empty();
    }
};

C++map方法属实不太会,还得学

20.用栈实现队列(0)

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

 

实现 MyQueue 类:

 

    void push(int x) 将元素 x 推到队列的末尾

    int pop() 从队列的开头移除并返回元素

    int peek() 返回队列开头的元素

    boolean empty() 如果队列为空,返回 true ;否则,返回 false

 

说明:

 

    你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。

    你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可

class MyQueue {
public:
    stack<int> stIn;        //输入栈
    stack<int> stOut;        //输出栈
    //入栈无返回,有参数
    void push(int x){
        stIn.push(x);//先加入输入栈
    }
    //出栈有返回,返回出栈的元素
    int pop(){
        //只有当stOut为空的时候,再从stIn里面导入全部数
        if(stOut.empty()){
            //从stIn导入数据直到stIn为空
            while(!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        //出栈的有元素,可以出栈,临时保存栈顶
        int front = stOut.top();
        stOut.pop();
        return front;
    }
    int peek(){
        int res = this->pop();  //直接使用已有的pop函数
        stOut.push(res);    //因为pop函数弹出了元素res,所以在添加回去
        return res;
    }


    bool empty(){
        return stOut.empty()&&stIn.empty();
    }
};

之后再细看吧

21.二叉树的前序遍历

blog.csdn.net/weixin_4266…

给你二叉树的根节点 root ,返回它节点值的 前序 **遍历

前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树