题目描述
知识点
字符串、栈
结果
实现
码前思考
- 是我们在刚刚入门栈这种数据结构时都会讲的表达式求值问题的低级版,话说我现在好像还不会表达式求值😓后面一定要补上!
代码实现
//类似于表达式求值
//只不过这个表达式求值会更加地简单一些
class Solution {
public:
bool isValid(string s) {
int size = s.size();
if(size == 0){
return true;
}
//设置一个栈
stack<char> st;
//设置一个指针变量指向string的位置
int index = 0;
//设置映射表
map<char,char> mp;
mp[')'] = '(';
mp['}'] = '{';
mp[']'] = '[';
//先将第一个字符压栈
st.push(s[index]);
index++;
for(;index<size;index++){
char cur = s[index];
//如果是需要匹配的
if(mp.count(cur) != 0){
//如果此时栈空了,也算是不匹配,要返回false
if(st.empty()){
return false;
}else{
//取栈顶
char top = st.top();
//如果不匹配,返回false
if(top != mp[cur]){
return false;
}else{
//匹配则弹出
st.pop();
}
}
}else{
//不需要匹配就进行压栈
st.push(s[index]);
}
}
//如果读取完之后,栈还不为空,那么说明不匹配
if(!st.empty()){
return false;
}
return true;
}
};
码后反思
- 注意,在处理栈,队列这类问题时,我们每次取元素的时候都要思考:会不会没有元素了?这是经常忽视的地方!
- 这种数据结构类型的题,要考虑清楚所有情况,一个有效的方法就是尝试自己编写多个测试用例,比较坑的那种,只有自己思考清哪里有坑,写代码才能对症下药!测试驱动开发√
- 看网友说的,对于栈为空可以一开始在栈中加一个“?”,其实用到的就是编译原理里面的那个知识点了,很好的思想👍
参考文档
二刷代码
学会了使用编译原理里面的‘#’
:
//采用栈进行解题
class Solution {
public:
bool isValid(string s) {
map<char,char> mp = {{')','('},{']','['},{'}','{'}};
stack<char> st;
st.push('#');//编译原理传统艺能
for(int i=0;i<s.size();i++){//不考虑最后一个字符‘#’
char curChar = s[i];
if(s[i]==')'||s[i]=='}'||s[i]==']'){
if(st.top()==mp[s[i]]){
st.pop();
}else{
st.push(s[i]);
}
}else{
st.push(s[i]);
}
}
if(st.top()!='#'){
return false;
}else{
return true;
}
}
};