20.有效括号
题目描述:
解题思路:使用栈来解决。最原始的思路就是遍历字符串,然后将遍历到的字符存入栈内。如果发现有相匹配的括号的话,则弹出这一对括号,即完成“消消乐”。但是从代码实现上,会比较繁琐,且容易出错。现对不匹配的情况进行总结。
有三种情况会出现return false的情况。
1、左括号多了;
2、右括号多了;
3、左右括号不匹配。
优化思路:当遍历到左括号的时候,则往栈内存入对应的右括号。当遍历到右括号的时候,则将这个括号与栈顶的元素相比较,若相等则弹出栈顶元素,继续遍历比较,若不相等则return false(情况2),当还没有完成整个字符串遍历的时候,栈内已经为空,则说明右括号多了(情况3);当遍历完字符串之后发现栈内还有多余元素没有弹出,则说明左括号多了(情况1)。最后没有出现这三种情况中的任何一种则说明括号完全匹配。
代码实现:
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 != 0) return false;//若字符串长度不为2则直接报错
stack<char>stack1;
for(int i =0;i < s.size();i++){
if(s[i] == '(') stack1.push(')');
else if(s[i] == '[') stack1.push(']');
else if(s[i] =='{') stack1.push('}');
else if( stack1.empty() || stack1.top() != s[i]) return false;//情况2,3
else stack1.pop();
}
if(!stack1.empty()){//情况1
return false;
}
return true;
}
};
1047.删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
题目描述:
解题思路:可以使用栈解题。当栈为空或则栈顶元素不等于遍历到的元素的时候,则往栈内压入现在遍历到的元素,若遍历到的元素等于栈顶元素的时候,则将栈顶元素弹出,继续往后遍历。最后依次让栈内元素弹出,并保存,然后进行反转则能够获取到相应结果。
代码实现:
class Solution {
public:
string removeDuplicates(string s) {
stack<char>stack1;
for(int i =0; i<s.size();i++){
if(stack1.empty() || s[i] != stack1.top()){
stack1.push(s[i]);
}
else{
stack1.pop();
}
}
string result = "";
while(!stack1.empty()){
result += stack1.top();
stack1.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
150.逆波兰表达式求值
题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
题目描述:
解题思路:这题其实和上一题思路一样,只不过是将弹出元素的操作换成了元素之间的运算,然后运算完成之后需要把结果重新压入栈内。
代码实现:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
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] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
} else {
st.push(stoll(tokens[i]));
}
}
int result = st.top();
st.pop();
return result;
}
};