LeetCode 20 有效的括号
题目链接:https://leetcode.cn/problems/valid-parentheses/
思路:
根据题意来做即可。
自己写的代码:
遇到左括号的时候将左括号入栈,遇到右括号的时候,将其与栈顶元素比较,看是否匹配。
缺点:代码冗长。
class Solution {
public:
bool isValid(string s) {
stack<char>s1;
for(int i =0;i<s.size();i++)
{
if(s[i]=='{'||s[i]=='['||s[i]=='(')
s1.push(s[i]);
else
{
if(s[i]==')')
{
if(s1.empty())
return false;
char tmp = s1.top();
if(tmp =='(')
{
s1.pop();
}
else
return false;
}
if(s[i]=='}')
{
if(s1.empty())
return false;
char tmp = s1.top();
if(tmp =='{')
{
s1.pop();
}
else
return false;
}
if(s[i]==']')
{
if(s1.empty())
return false;
char tmp = s1.top();
if(tmp =='[')
{
s1.pop();
}
else
return false;
}
}
}
if(s1.empty())
return true;
else
return false;
}
};
卡哥的代码:
在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了
class Solution {
public:
bool isValid(string s) {
stack<char>s1;
// 如果大小为奇数,必然不可能符合要求
if(s.size()%2!=0)
return false;
for(int i = 0;i<s.size();i++)
{
if(s[i]=='(')
s1.push(')');
else if(s[i]=='[')
s1.push(']');
else if(s[i]=='{')
s1.push('}');
else if(s1.empty()||s[i]!=s1.top())
return false;
else
s1.pop();
}
return s1.empty();
}
};
总结
相对简单。学习简化代码的方法。
LeetCode 1047 删除字符串中的所有相邻重复项
题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
思路:
将元素入栈,如果遇到重复的元素,即栈顶元素和即将入栈的元素相同,那么将栈顶元素弹出。
自己的代码:
忘记了string有reverse()函数,写的复杂了。
class Solution {
public:
string removeDuplicates(string s) {
stack<char>s1;
for(int i = 0;i<s.size();i++)
{
if(s1.empty())
s1.push(s[i]);
else
{
if(s[i]==s1.top())
s1.pop();
else
s1.push(s[i]);
}
}
stack<char>s2;
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
string result;
while(!s2.empty())
{
result += s2.top();
s2.pop();
}
return result;
}
};
卡哥的代码
class Solution {
public:
string removeDuplicates(string s) {
stack<char>s1;
for(int i = 0;i<s.size();i++)
{
if(s1.empty()||s[i]!=s1.top())
s1.push(s[i]);
else
s1.pop();
}
string result;
while(!s1.empty())
{
result += s1.top();
s1.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
总结:
相对简单。
LeetCode 150 逆波兰表达式求值
题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
思路:
根据题意来写就好。
代码:
stoll(char s)函数是将参数提供的字符串转换为long long类型。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long>s;
for(int i = 0;i<tokens.size();i++)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
long long num1 = s.top();
s.pop();
long long num2 = s.top();
s.pop();
if(tokens[i]=="+")
s.push(num2+num1);
else if(tokens[i]=="-")
s.push(num2-num1);
else if(tokens[i]=="*")
s.push(num2*num1);
else if(tokens[i]=="/")
s.push(num2/num1);
}
else
s.push(stoll(tokens[i]));
}
return s.top();
}
};
总结:
以前做过,复习起来相对简单。
今日总结:
今天的题目用栈来解决问题,都相对简单。写代码的时候要注意如何可以使代码更加的简洁。