20.有效的括号
链接: 20.有效的括号
class Solution {
public:
bool isValid(string s) {
stack<char> leftStack;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
{
leftStack.push(s[i]);
}
else if(!leftStack.empty())
{
if ((s[i] == ')' && leftStack.top() == '(') ||
(s[i] == ']' && leftStack.top() == '[') ||
(s[i] == '}' && leftStack.top() == '{'))
{
leftStack.pop();
}
else
{
return false;
}
}
else
return false;
}
return leftStack.empty() ? true : false;
}
};
思路与收获
- 本题首先要弄清楚括号字符串不合法的情况有几种,分别是怎样不合法,然后再写代码就比较简单了,否则很容易考虑不周全。
- 我的实现代码并不是最优代码,如果是左括号入栈,则遇到右括号还需要判断是否匹配,而这个判断过程有点麻烦;如果遇到左括号把相应的右括号入栈,则遇到右括号时只需要判断是否相等就可以了,代码实现更简单。
1047.删除字符串中的所有重复项
class Solution {
public:
string removeDuplicates(string s) {
string result;
stack<char> charStack;
for(int i = 0; i < s.size(); ++i)
{
if(!charStack.empty() && s[i] == charStack.top())
charStack.pop();
else
charStack.push(s[i]);
}
while(!charStack.empty())
{
result += charStack.top();
charStack.pop();
}
reverse(result.begin(), result.end());
return result;
}
};
思路与收获
- 本题并不难,但在代码实现时有点讲究,最后栈中的字符组成的字符串就是结果字符串,但是栈顶字符是字符串的末尾字符,栈底字符是结果字符串的开始字符。
- 如果每次把出栈的字符放到字符串第一位,则执行效率很低,而如果依次弹出字符,再把字符串调换顺序则执行效率更高。
150.逆波兰表达式求值
链接: 150.逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
int result = 0;
int tmp = 0;
for (unsigned int i = 0; i < tokens.size(); ++i)
{
if ((tokens[i] != "+") && (tokens[i] != "-") && (tokens[i] != "*") && (tokens[i] != "/"))
{
st.push(stoi(tokens[i]));
}
else
{
tmp = st.top();
st.pop();
result = st.top();
st.pop();
if (tokens[i] == "+") result += tmp;
else if (tokens[i] == "-") result -= tmp;
else if (tokens[i] == "*") result *= tmp;
else result /= tmp;
st.push(result);
}
}
return st.top();
}
};
思路与收获
- 力扣的提示中已经指出本题的思路,所以要在代码实现上费一点功夫,个人的做法是先在某个IDE中写出基本实现代码,再想可以怎样优化代码,提高执行效率,争取写出效率最高的代码。