代码随想录算法训练营第11天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号
题目链接:20. 有效的括号,难度:简单
【实现代码】
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if ('(' == s[i]) {
st.push(')');
} else if ('[' == s[i]) {
st.push(']');
} else if ('{' == s[i]) {
st.push('}');
} else if (st.empty() || s[i] != st.top()) {
return false;
} else {
st.pop();
}
}
return st.empty();
}
};
【解题思路】
- 首先应分析会出现的情况,一是左括号多余(栈最后不为空);二是中间的括号不匹配;三是右括号多余(栈为空但字符未结束);四是有效的括号。
- 见到左括号就入栈,这里是将对应的右括号入栈,是一个小技巧,更方便比较;
- 碰到右括号就与栈顶元素比较,不相同就返回false。
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项,难度:简单
【实现代码】
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (st.empty() || s[i] != st.top()) {
st.push(s[i]);
} else {
st.pop();
}
}
s.resize(0);
while (!st.empty()) {
s += st.top();
st.pop();
}
reverse(s.begin(), s.end());
return s;
}
};
【解题思路】
- 栈为空或者当前元素与栈顶元素不相等时,入栈;
- 当前元素与栈顶元素相等时就弹栈;
- 最后将栈中元素弹出,注意反转字符串。
20. 有效的括号
题目链接:150. 逆波兰表达式求值,难度:中等
【实现代码】
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int result;
stack<int> st;
string t;
int num, num1, num2;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/") {
t = tokens[i];
num = 0;
for(int j = 0; j < t.size(); j++) {
if (t[j] != '-') {
num = (t[j] - '0') + num * 10;
}
}
if (t[0] == '-') {
num = -num;
}
st.push(num);
} else {
num2 = st.top();
st.pop();
num1 = st.top();
st.pop();
if (tokens[i] == "+") {
st.push(num1 + num2);
} else if (tokens[i] == "-") {
st.push(num1 - num2);
} else if (tokens[i] == "*") {
st.push(num1 * num2);
} else if (tokens[i] == "/") {
st.push(int(num1 / num2));
}
}
}
result = st.top();
st.pop();
return result;
}
};
【解题思路】
此题的想法还是比较简单的,碰到运算符号就弹出两个栈顶元素,进行四则运算,需要注意数据的顺序。
我这里自己实现了字符串到数字的转换,也可以使用库函数C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)