给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
题目链接:力扣
思路与解答:这道题用栈结构来解决,遍历字符串,遇到左括号压入栈,遇到右括号弹出
时间复杂度: O(n)
空间复杂度: O(n)
class Solution {
public:
bool isValid(string s) {
stack sta;
if(s.size() % 2 != 0)
return false;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '(') sta.push(')');
else if(s[i] == '{') sta.push('}');
else if(s[i] == '[') sta.push(']');
else if(sta.empty() || sta.top() != s[i]) return false;
else sta.pop();
}
return sta.empty();
}
};
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
题目链接:力扣
思路与解答:遍历字符串,与栈顶元素比较,相同就弹出栈顶元素,不相同就压入栈
时间复杂度: O(n)
空间复杂度: O(1)
class Solution {
public:
string removeDuplicates(string s) {
string result;
for(char c : s)
{
if(result.empty() || c != result.back())
result.push_back(c);
else
result.pop_back();
}
return result;
}
};
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
'+'
、'-'
、'*'
和 '/'
。题目链接:力扣
思路与解答:遍历字符串,遇到数字就压入栈,遇到操作符就弹出栈内元素
时间复杂度: O(n)
空间复杂度: O(n)
class Solution {
public:
int evalRPN(vector& tokens) {
stack sta;
long long num1, num2;
for(int i = 0; i < tokens.size(); i++)
{
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
num1 = sta.top();
sta.pop();
num2 = sta.top();
sta.pop();
if(tokens[i] == "+") sta.push(num2 + num1);
else if(tokens[i] == "-") sta.push(num2 - num1);
else if(tokens[i] == "*") sta.push(num2 * num1);
else sta.push(num2 / num1);
}
else
sta.push(stoll(tokens[i]));
}
long long result = sta.top();
sta.pop();
return result;
}
};