一、有效的括号
题目一:20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
首先定义了一个哈希表
brackets
来存储每种右括号对应的左括号。然后,遍历字符串s
中的每个字符:
- 如果是左括号,就将它压入栈中。
- 如果是右括号,检查栈是否为空或栈顶元素是否是对应的左括号。如果不是,返回 false。否则,弹出栈顶元素。
遍历结束后,如果栈为空,则表示所有括号都有效地匹配了,返回 true。如果栈不为空,则表示存在未匹配的括号,返回 false。
/*
* @lc app=leetcode.cn id=20 lang=cpp
*
* [20] 有效的括号
*/
// @lc code=start
class Solution {
public:
bool isValid(string s) {
unordered_map<char, char> brackets = {{')', '('}, {']', '['}, {'}', '{'}};
stack<char> stack;
for (char c: s) {
if (c == '(' || c == '[' || c == '{')
stack.push(c);
else {
if (stack.empty() || stack.top() != brackets[c])
return false;
stack.pop();
}
}
return stack.empty();
}
};
// @lc code=end
一、 删除字符串中的所有相邻重复项
题目一:1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
遍历字符串时,如果当前字符与栈顶字符相同,就将栈顶字符弹出,这样就删除了一对相邻重复项。如果当前字符与栈顶字符不同,就将当前字符压入栈中。遍历完成后,栈中存储的就是删除所有相邻重复项后的字符串。
/*
* @lc app=leetcode.cn id=1047 lang=cpp
*
* [1047] 删除字符串中的所有相邻重复项
*/
// @lc code=start
class Solution {
public:
string removeDuplicates(string s) {
stack<char> stack;
string res;
for (char c: s) {
if (!stack.empty() && stack.top() == c)
stack.pop();
else
stack.push(c);
}
while (!stack.empty()) {
res = stack.top() + res;
stack.pop();
}
return res;
}
};
// @lc code=end
三、逆波兰表达式求值
题目一:150. 逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
使用栈结构,根据以下规则操作:
- 遍历表达式中的每个元素。
- 如果遇到一个数字,就将其压入栈中。
- 如果遇到一个运算符,就从栈中弹出两个数字,对它们执行相应的运算,然后将结果压回栈中。
- 表达式的最终值将是栈顶元素。
/*
* @lc app=leetcode.cn id=150 lang=cpp
*
* [150] 逆波兰表达式求值
*/
// @lc code=start
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for (string& token : tokens) {
if (token == "+" || token == "-" || token == "*" || token == "/") {
int num2 = st.top(); st.pop();
int num1 = st.top(); st.pop();
if (token == "+") st.push(num1 + num2);
else if (token == "-") st.push(num1 - num2);
else if (token == "*") st.push(num1 * num2);
else if (token == "/") st.push(num1 / num2);
} else {
st.push(stoi(token));
}
}
return st.top();
}
};
// @lc code=end