20.有效的括号

记录新手小白的做题过程。


题目:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。


思路:这道题是在考试的时候考的。不得不说太尴尬了,才学的线性表,可是这道题居然完全没想起来要用栈,自己折腾折腾了好久。后面同学提醒要用栈,就自己写出了如下代码。

int mian(){
    stack<char> stl;
    char ch;
    cin>>ch;
    while(ch!='\0'){
        if(ch=='}'){
            char ch1=stl.top();
            stl.pop();
            if(ch1!='{'){
                cout<<"no"<<endl;
                return 0;
            }
        }
        else if(ch==']'){
            char ch1=stl.top();
            stl.pop();
            if(ch1!='['){
                cout<<"no"<<endl;
                return 0;
            }
        }
        else if(ch==')'){
            char ch1=stl.top();
            stl.pop();
            if(ch1!='('){
                cout<<"no"<<endl;
                return 0;
            }
        }
        else if(ch=='>'){
            char ch1=stl.top();
            stl.pop();
            if(ch1!='<'){
                cout<<"no"<<endl;
                return 0;
            }
        }
        else{
            stl.push(ch);
            cout<<"lll"<<endl;
        }
        cin>>ch;
        cout<<"kkk"<<endl;
    }
    cout<<"Yes"<<endl;
    return 0;
}

总之就是,将左括号压入栈中,当遇到右括号时 ,弹出栈的top值,与这个右括号比较看是否合格,但是不知道为什么陷入死循环了。

后来据了解,是因为我是一个字符一个字符取的,已经没有结束符了,所以它在输入所以括号时一直等到输入,没有结束符给它。


看一下官方代码,高,实在是高。

 官方代码

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }

        unordered_map<char, char> pairs = {//用这个直接将符号匹配起来
            {')', '('},//前面是key,用count查找,后面是valus,用pairs[key]查找
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;
        for (char ch: s) {
            if (pairs.count(ch)) {
                if (stk.empty() || stk.top() != pairs[ch]) {//遇到右括号,栈顶不为左括号或者为空,都不合格
                    return false;
                }
                stk.pop();弹出
            }
            else {
                stk.push(ch);
            }
        }
        return stk.empty();
    }
};

记录自己编译遇到的几个错误:

1. unordered_map的写法错了//不要忘记这个的头文件时#include<unordered_map>

unordered_map<char,char> pairs={//不要忘记等于号
  {'}','{'},
  {']'.''['}
  {')','('}//三个分别要用{}圈起来,而且要逗号
};//冒号

2.pairs.count[ch]//明明是圆括号······

3.for(char ch:s)//遍历 

4.在此我发现一件事

这样写是错的,必须要先判断为空,才能取栈顶,这个顺序不能改

5.count函数,计算数目的,因为不会有重复元素,所以只会返回0或者1

maps[1]="one";是这样写的,前面是键值,后面是后面的,count查找的是键值

​​​​​​(9条消息) C++ STL算法系列count函数_lyj2014211626的博客-优快云博客_c++ count函数

比较:find函数,查找返回迭代器,查找不到返回end()


好了,今天又收获了一点点继续加油!

下一题! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值