LeetCode C++ 20.有效的括号

题目

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

有效字符串需满足:
1-左括号必须用相同类型的右括号闭合。
2-左括号必须以正确的顺序闭合。

示例1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

思路:

1-解决办法为栈,先提取存储括号的字符串s,如果是左括号就依次放入栈里,如果是右括号就弹出栈顶与它匹配,匹配上了这一步就是正确的,否则就是错误的。也就是说假如先来了好几个左括号就都存进去了,但是一旦来了一个右括号,它就必须和栈顶的这个左括号匹配上,否则就是错误的。这就是栈的基本思路。

2-需要的函数:

  1. 首先我们需要一个栈,这个栈里面俩参数,一个存字符、一个存栈顶。
  2. 需要初始化栈顶数据用于判断栈是否为空。
  3. 入栈、出栈赋值。
  4. 循环括号匹配。
  5. 有效性检查,这里就是官方提示的函数。注意这里需要将字符串类型转换为字符数组类型,才可以应用于栈。

3-补充知识:
char:是字符指针数据类型,它的本质是个指针,也就是地址,它指向了一个char类型的内存单元。
栈:先进后出
strcpy错误:包含头文件#include <cstring>

代码:

#define MAXSize 10000
using namespace std;
#include <cstring>
class Solution {
public:
    struct Stack{
        char data[MAXSize]; 
        int top; //栈顶指针
    };

    //初始化栈
    void InitStack(Stack &S){
        S.top = -1;
    }
    
    //判断栈是否为空
    bool StackEmpty(Stack S){
        if(S.top == -1){
            return true;
        }else{
            return false;
        }
    }

    //入栈 栈对象S和括号组x
    bool Push(Stack &S, char m){
        if(S.top == MAXSize-1){
            return false;
        }else{
            S.top++;
            S.data[S.top] = m; //S.top指向栈顶
            return true;
        }
    }

    //出栈
    bool Pop(Stack &S, char &m){
        if(S.top == -1){
            return false;
        }else{
            m = S.data[S.top--]; //先赋值再--
            return true;
        }
    }

    //获取长度
    int GetLength(char str[]){
        int i = 0;
        while(str[i] != '\0'){
            i++;
        }
        return i;
    }

    //括号匹配
    bool Match(char str[], int len){
        Stack S;
        InitStack(S);
        for(int i = 0; i < len; i++){
            if (str[i] == '(' || str[i] == '{' || str[i] == '['){
                Push(S, str[i]); //扫描到左括号,入栈
            }else{
                if(StackEmpty(S)){  //扫描到右括号,且栈为空
                    return false;
                }
                char topElem;
                Pop(S, topElem); //栈顶元素出栈
                if(str[i] == ')' && topElem != '('){
                    return false;
                }
                if(str[i] == '}' && topElem != '{'){
                    return false;
                }
                if(str[i] == ']' && topElem != '['){
                    return false;
                }
            }
        }
        return StackEmpty(S); //全部匹配结束栈空为成功
    }
public:
    bool isValid(string s) {
        string e = s;
        // cout << s;
        char w[MAXSize];
        strcpy(w,e.c_str());
        // cout << w;
        int len = GetLength(w);
        // cout << len;
        bool result = Match(w, len);
        if(result == 1){
            return true;
        }else{
            return false;
        }
    }
};

简单解算办法:

class Solution {
public:
    bool isValid(string s) {
        int len = s.size();
        if(len%2==1)
            return false;
        stack<int> ans;
        for(int i =0; i < len; i++){
            if(s[i]=='(' || s[i]=='{' || s[i]=='['){
                ans.push(s[i]);
            }
            if(s[i]==')' || s[i]==']' || s[i]=='}'){
                if(ans.size()<1)
                    return false;
                char c = ans.top();
                ans.pop();
                if((s[i]==')'&&c!='(') || (s[i]==']'&&c!='[') || (s[i]=='}'&&c!='{' )){
                    return false;
                }
            }
        }
        if(ans.size()>0)
            return false;
        return true;
    }
};

问题:

1-形参有时候值传递,有时候引用传递区别是什么?
2-第一种方法提交会出错,目前没有找到解决办法?-----解决:maxsize设置为10000即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值