栈与队列的第二天~加油!😊💪
文章目录
Leetcode 20-有效的括号
题目描述
https://leetcode.cn/problems/valid-parentheses/
解题思路
首先我们来分析一下出现括号不匹配的情况,主要可以分为三种,如图所示,在求解每种情况时,当我们遇到左侧括号时,可以将其对应的右括号 push 入栈,遇到右括号时,需要比较字符串当前字符是否与栈顶元素匹配,如果不匹配则直接返回 false,如果匹配则将栈顶元素弹出。
针对三种情况我们可以分析其出现不匹配的情况:
完整代码如下:
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false;//进行剪枝操作
stack<char>stat;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') stat.push(')');
else if (s[i] == '{') stat.push('}');
else if (s[i] == '[') stat.push(']');
else if (stat.empty() || s[i] != stat.top()) return false;//注意这里先判断stat是否为空是为了防止在后续进行stat.top()操作时出现操作空栈的情况
else stat.pop();//如果字符串当前元素与栈顶元素相同,则弹出
}
if (!stat.empty()) return false;
else return true;
}
};
Leetcode 1047-删除字符串中的所有相邻重复项
题目描述
https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/
解题思路
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (int i = 0; i < s.size(); i++) {
if (result.empty() || result.back() != s[i]) {
result.push_back(s[i]);
}
else {
result.pop_back();
}
}
return result;
}
};
关于 push 和 push_back
push 通常用于栈和队列等容器,其将元素添加到容器末尾(对于队列)或顶部(对于栈),而 push_back 用于动态数组和双向链表等容器,将元素添加到容器末尾。在这道题目中,我们使用 string 模拟栈实现删除字符串相邻重复项的操作,因此使用的操作时 push_bakc 而非 push。
Leetcode 150-逆波兰表达式求值
题目描述
解题思路
这道题仍使用栈来解决,解决思路是遍历给定的字符串数组 tokens,如果当前元素是数字,将其存入栈中,如果是操作符,则从栈中取出两个元素,进行对应的操作后将操作结果返回到栈中。整体代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> result;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
int num1 = result.top();
result.pop();
int num2 = result.top();
result.pop();
if (tokens[i] == "+") result.push(num1 + num2);
else if (tokens[i] == "-") result.push(num2 - num1);
else if (tokens[i] == "*") result.push(num2 * num1);
else if (tokens[i] == "/") result.push(num2 / num1);
}
else result.push(stoi(tokens[i]));//将字符串类型转为符合result栈的int类型
}
int final = result.top();
result.pop();
return final;
}
};