有效的括号
20. 有效的括号 - 力扣(LeetCode)
由于栈结构的特殊性,非常适合做对称匹配类的题目。
首先要弄清楚,字符串里的括号不匹配有几种情况。
一些同学,在面试中看到这种题目上来就开始写代码,然后就越写越乱。
建议在写代码之前要分析好有哪几种不匹配的情况,如果不在动手之前分析好,写出的代码也会有很多问题。
先来分析一下 这里有三种不匹配的情况,
- 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
- 第二种情况,括号没有多余,但是 括号的类型没有匹配上。
- 第三种情况,字符串里右方向的括号多余了,所以不匹配。
我们的代码只要覆盖了这三种不匹配的情况,就不会出问题,可以看出 动手之前分析好题目的重要性。
动画如下:
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。
分析完之后,代码其实就比较好写了,
但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false; // 如果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(']');
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
else if (st.empty() || st.top() != s[i]) return false;
else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
考察栈的经典应用
在逐个元素入栈的过程中,无非三种情况,第一种是栈为空:直接入栈,第二种是元素与与栈顶元素相同,弹出栈顶元素,第三种是其他情况,直接入栈
然后就是返回答案的问题,我的思路是,先构建出栈
即
class Solution {
public:
string removeDuplicates(string s) {
stack<char>st;
for(int i=0;i<s.size();i++){
if(st.empty())st.push(s[i]);
else if(s[i]==st.top())st.pop();
else{st.push(s[i]);}
}
stack<char>stout;
while(!st.empty()){
char a=st.top();
st.pop();
stout.push(a);
}
string result;
while(!stout.empty()){
char a=stout.top();
stout.pop();
result.push_back(a);}
return result;
}
};
逆波兰表达式求值
150. 逆波兰表达式求值 - 力扣(LeetCode)
先介绍一个函数stoi,
可以将一个字符串转换成整型数字,包负数
stoi函数是C++标准库中的一个函数,用于将字符串转换为整数。它位于头文件中,并且属于std命名空间。
stoi函数的原型如下:
int stoi(const string& str, size_t* pos = 0, int base = 10);
该函数接受三个参数:
- str:要转换为整数的字符串。
- pos(可选):一个指向size_t类型的指针,用于存储转换后的字符串的最后一个字符的索引。如果该参数不为nullptr,stoi函数会将转换后的字符串的最后一个字符的索引存储在该指针指向的变量中。
- base(可选):转换时使用的进制。默认为10,表示十进制。可以是2-36之间的任何值,包括16进制。
stoi函数会尝试将给定的字符串转换为整数。它会从字符串的开头开始解析,直到遇到一个非数字字符为止。如果字符串中的第一个字符是正号或负号,它也会被解析为整数的一部分。解析过程中,stoi函数会忽略前导空格。
如果转换成功,stoi函数会返回转换后的整数值。如果转换失败,例如字符串中包含非数字字符,或者超出了整数的表示范围,stoi函数会抛出一个invalid_argument异常。
下面是stoi函数的一些示例用法:
#include <iostream>
#include <string>
int main() {
std::string str = "12345";
int num = std::stoi(str);
std::cout << "转换后的整数:" << num << std::endl;
std::string str2 = "-9876";
int num2 = std::stoi(str2);
std::cout << "转换后的整数:" << num2 << std::endl;
std::string str3 = "42 is the answer";
size_t pos;
int num3 = std::stoi(str3, &pos);
std::cout << "转换后的整数:" << num3 << std::endl;
std::cout << "最后一个字符的索引:" << pos << std::endl;
return 0;
}
输出:
转换后的整数:12345 转换后的整数:-9876 转换后的整数:42 最后一个字符的索引:1
在这个示例中,我们使用stoi函数将字符串转换为整数,并输出转换后的结果。第一个例子中,字符串"12345"被转换为整数12345。第二个例子中,字符串"-9876"被转换为整数-9876。第三个例子中,字符串"42 is the answer"被转换为整数42,并且最后一个字符的索引存储在pos变量中。
通过使用std::stoi函数,您可以方便地将字符串转换为整数,并进行必要的错误检查和处理。
题目代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int>st;
for(int i=0;i<tokens.size();i++){
if(tokens[i]!="+"&&tokens[i]!="-"&&tokens[i]!="/"&&tokens[i]!="*"){
int t=stoi(tokens[i]);
st.push(t);
}
else{
int b = st.top();
st.pop();
int a = st.top();
st.pop();
if (tokens[i] == "+") {
st.push(a + b);
} else if (tokens[i] == "-") {
st.push(a - b);
} else if (tokens[i] == "*") {
st.push(a * b);
} else if (tokens[i] == "/") {
st.push(a / b);
}
}}
return st.top();
}
};