记录新手小白的做题过程。
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 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()
好了,今天又收获了一点点继续加油!
下一题!