思路:本题的思路就是将左括号对应的右括号输入到栈中,如果栈顶元素与对应的右括号相同,则满足有效的规则,弹出栈顶元素,继续比较,直到栈空。
class Solution {
public:
bool isValid(string s) {
if(s.size()%2!=0){
return false;
}
stack<char> dps;
for(int i=0;i<s.size();i++){
if(s[i]==')'||s[i]=='}'||s[i]==']'){
if(dps.empty()){
return false;
}
else{
if(dps.top()!=s[i]){
return false;
}
else{
dps.pop();
}
}
}
else{
if(s[i]=='('){
dps.push(')');
}
else if(s[i]=='['){
dps.push(']');
}
else{
dps.push('}');
}
}
}
return dps.empty();
}
};
缩进没咋改动,所以看起来挺长的。做的时候很自信,提交的时候错了才知道自己没把栈顶元素匹配完毕后弹出。真是有点尬。之后也要注意,栈顶元素使用完毕后记得弹出。
二、删除字符串中的所有相邻的重复项
这题还是主 要使用栈的属性,看抓取的元素与栈顶元素是否相同,相同则推出栈顶元素,同时抓取下一元素,如果不相同则将此元素推入栈中。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i=0;i<s.size();i++){
if(st.empty()||s[i]!=st.top()){
st.push(s[i]);
}
else{
st.pop();
}
}
string result="";
while(!st.empty()){
result += st.top();
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
需要注意的点是当把所有s中的元素遍历完之后。应该将栈中元素重新推入结果字符串,然后,应该将字符串前后颠倒(由于后进先出,先输入result中的是尾部元素)
注意弹出栈中元素(笑死,差点又犯毛病)
三、逆波兰表达式求值
思路:主要还是依据栈的特点——后进先出。如果遇到操作数的话,推入栈中,如果遇到符号的话,就取出栈顶的两位操作数做相应的操作
class Solution {
public:
int evalRPN(vector<string>& tokens) {
long long result=0;
stack<long long> st;
for(int i =0;i<tokens.size();i++){
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
if(tokens[i]=="+"){num1+=num2;st.push(num1);}
if(tokens[i]=="-"){;st.push(num2-num1);}
if(tokens[i]=="*"){num1*=num2;st.push(num1);}
if(tokens[i]=="/"){;st.push(num2/num1);}
}
else{
st.push(stoll(tokens[i]));
}
}
result = st.top();
st.pop();
return result;
}
};
大致思路是对的,就是三个地方卡了一下。一个是stoll是字符串数组转数字;
另一个是字符串的数组单拎出来的时候要用双引号,比如说"+";
还有一个是num2是主操作数,不然减法和除法会出问题。
用了大概一个小时,栈最近复习过还算比较熟悉了。继续加油