给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
每读取一个符号判断如果是右括号则判断栈不空且栈顶左括号匹配则弹出,否则加入栈,最后判断栈是不是空。
class Solution {
public:
bool isValid(string s) {
stack<char> res;
res.push(s[0]);
for(int i = 1; i < s.size(); i++){
if(s[i] == ')' )
if((!res.empty()) && res.top() == '(')
res.pop();
else
res.push(s[i]);
else if(s[i] == ']' )
if((!res.empty()) && res.top() == '[')
res.pop();
else
res.push(s[i]);
else if(s[i] == '}' )
if((!res.empty()) && res.top() == '{')
res.pop();
else
res.push(s[i]);
else{
res.push(s[i]);
}
}
return res.empty();
}
};
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
相邻的重复字符串,遍历每个字符,如果栈不为空,那么就取栈顶和元素比较,相同就直接栈顶移除,那么就移除了邻近的两个相同字母,循环。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> res;
for(int i = 0; i < s.size(); i++){
if(res.empty())
res.push(s[i]);
else if(res.top() == s[i])
res.pop();
else
res.push(s[i]);
}
string ans = "";
while(!res.empty()){
ans += res.top();
res.pop();
}
reverse(ans.begin(),ans.end());
return ans;
}
};
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
使用栈来存储字符串中的数字,每次遍历到运算符,则去除栈顶两个元素,得到计算结果存入栈中继续运算,最后栈中剩余的元素即答案。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> s;
for(int i = 0; i < tokens.size(); i++){
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){
long long b = s.top();
s.pop();
long long a = s.top();
s.pop();
if(tokens[i] == "+")
s.push(a + b);
else if(tokens[i] == "-")
s.push(a - b);
else if(tokens[i] == "*")
s.push(a * b);
else if(tokens[i] == "/")
s.push(a / b);
}
else{
s.push(stoll(tokens[i]));
}
}
long long ans = s.top();
return ans;
}
};