题目:给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
输入:s = "()" 输出:true
class Solution {
public:
bool isValid(string s) {
if(s.size()%2!=0) return false;
stack<char> temp;
for(int i=0;i<s.size();i++){
switch (s[i]){
case '(': temp.push(')');break;
case '[': temp.push(']');break;
case '{': temp.push('}');break;
case ')':
if(!temp.empty()&&temp.top()==s[i]){
temp.pop();
}
else{
return false;
}
break;
case ']':
if(!temp.empty()&&temp.top()==s[i]){
temp.pop();
}
else{
return false;
}
break;
case '}':
if(!temp.empty()&&temp.top()==s[i]){
temp.pop();
}
else{
return false;
}
break;
}
}
if(temp.empty()) return true;
else return false;
}
};
思路:为什么用栈来解,因为栈本质上所提供的关系就是包含与被包含的关系,先入栈的元素在逻辑上包含后入栈的元素,栈底元素在逻辑上包含栈顶元素,正好括号的匹配也是必须从里到外,也就是从栈顶到栈底匹配,这符合出栈的顺序。
已解答
题目:给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
string removeDuplicates(string s) {
string res;
for(char c:s){
if(res.empty()||c!=res.back())
res.push_back(c);
else
res.pop_back();
}
return res;
}
思路:用栈来处理包含式的对消匹配问题。再用string模拟栈的行为
题目:给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> tmp;
for(string tk:tokens){
if(tk=="+"||tk=="-"||tk=="*"||tk=="/"){
int nums1=tmp.top();tmp.pop();
int nums2=tmp.top();tmp.pop();
switch (tk[0]) {
case '+': tmp.push(nums2+nums1);break;
case '-': tmp.push(nums2-nums1);break;
case '*': tmp.push(nums2*nums1);break;
case '/': tmp.push(nums2/nums1);break;
}
}
else{
tmp.push(stoll(tk));
}
}
int res = tmp.top();
tmp.pop();
return res;
}
};
逆波兰表达式即正常表达式(中序遍历 左中右)的对应的后序遍历的结果(左右中)
思路:遇到数字就入栈,遇到操作符就将对应的操作数出栈,并将计算结果入栈。