Leetcode - 20 有效的括号
这道题数据结构课程讲过这道题所以也比较好做,这道题用栈来实现,为了优化效率,我们可以先判断字符串的长度是否为基数,如果是基数我们就可以直接返回false,若果不是接着下面的继续判断,这道题我们利用栈的陷入后出的特点,当我们遍历到最后一个左括号就可以和最后入栈的有括号进行对比如果与栈中的元素相同就继续向下遍历,不同就报错,这里有三种错误的形式需要考虑到,一种是左括号数量大于有括号数量,一种是右括号数量大于左括号数量,最后一种是左右括号不匹配。当左括号数量大于有括号数量时,如果遍历到元素对应栈中的元素为空就报错,当右括号数量大于左括号数量时,最后返回栈是否为空,若果不为空就返回false,当括号不匹配时可以对该元素进行判断若该元素不等于栈中对应的元素就返回false
class Solution {
public:
bool isValid(string s) {
stack<char> a;
if(s.size() % 2 != 0){
return false;
}
for(int i = 0; i < s.size(); i++){
if(s[i] == '('){
a.push(')');
}
else if(s[i] == '['){
a.push(']');
}
else if(s[i] == '{'){
a.push('}');
}
else if(a.empty() || a.top() != s[i]){
return false;
}else{
a.pop();
}
}
return a.empty();
}
};
Leetcode - 1047 删除字符串中的所有相邻重复项
erase
函数的第一个参数是要删除的起始位置,第二个参数是要删除的字符数。
这则代码我的思路跟上题的大差不差但是我是用了erase这个函数来消除重复字符,但也就是因为这一点导致代码出了个bug一直照不出来是为什么对于全部为同一字母的序列就不会输出正确答案。。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> index;
int i = 0;
for(; i < s.size(); i++){
if(!index.empty() && index.top() == s[i]){
int w = i - 2;
s.erase(i - 1, 2);
i = max(0, w);
index.pop();
}else{
index.push(s[i]);
}
}
return s;
}
};
看了一个多小时才发现是那个max坏了一锅汤,我始终觉得-1会越界就取了个max但是没注意到上面还有个i++这就导致直接会漏掉一组重复字母。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> index;
int i = 0;
for(; i < s.size(); i++){
if(!index.empty() && index.top() == s[i]){
int w = i - 2;
s.erase(i - 1, 2);
i = max(0, w);
index.pop();
}else{
index.push(s[i]);
}
}
return s;
}
};
这期间还手写了一个while循环取替换掉erase函数但发现时间复杂度更高了。。。。
Leetcode - 150 逆波兰表达式求值
这道题也就是题目理解难了一点查了一下就通透了比较简单:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> op;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i][0] >= '0' && tokens[i][0] <= '9' || (tokens[i].size() > 1 && tokens[i][0] == '-')) {
// Convert the operand from string to integer and push onto the stack
op.push(std::stoi(tokens[i]));
} else if (tokens[i][0] == '+' || tokens[i][0] == '-' || tokens[i][0] == '*' || tokens[i][0] == '/') {
int b = op.top();
op.pop();
int a = op.top();
op.pop();
// 进行条件判断,并将结果入栈
if (tokens[i][0] == '+') {
op.push(a + b);
} else if (tokens[i][0] == '-') {
op.push(a - b);
} else if (tokens[i][0] == '*') {
op.push(a * b);
} else if (tokens[i][0] == '/') {
op.push(a / b);
}
}
}
// 返回栈顶的值作为最终结果
return op.top();
}
};
2024/3/5 20.47
-----------magixx