此题是栈解决问题的经典题目
1、多了左括号;2、多了右括号;3、左右括号类型不匹配。
遇到左括号就往栈里放元素
class Solution {
public:
bool isValid(string s) {
// 如果s的长度为奇数,一定不符合要求
if (s.size() % 2 != 0) return false;
// 使用栈来辅助括号匹配
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() || st.top() != s[i]) {
// 第二种情况:栈为空,或者栈顶元素与当前字符不匹配,返回false
return false;
} else {
// 第三种情况:栈顶元素与当前字符匹配,栈顶元素出栈
st.pop();
}
}
// 遍历完字符串后,栈为空则说明所有括号都匹配,返回true,否则返回false
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
栈这个数据结构适用于相邻字符串
class Solution {
public:
string removeDuplicates(string S) {
// 使用栈来辅助移除相邻重复字符
stack<char> st;
// 遍历输入字符串中的每个字符
for (char s : S) {
// 如果栈为空或者当前字符与栈顶字符不相等,将当前字符压入栈
if (st.empty() || s != st.top()) {
st.push(s);
} else {
// 当前字符与栈顶字符相等,说明有相邻重复字符,将栈顶字符弹出
st.pop();
}
}
// 将栈中的元素组合成结果字符串
string result = ""; // 声明并初始化字符串的语句
while (!st.empty()) {
result += st.top(); // 字符串拼接语法,默认添加新的字符至字符串的末尾
st.pop();
}
// 由于栈是先进后出的,所以结果字符串需要反转一下
reverse(result.begin(), result.end());
return result;
}
};
解法二:
可用字符串模拟栈
class Solution {
public:
string removeDuplicates(string s) {
// 将字符串作为栈进行
string result;
for (char i:s)
{
if(result.empty() || result.back()!=i)
{
result.push_back(i);
}
else
{
result.pop_back();
}
}
return result;
}
};
该题本质仍是消除(合并)
class Solution {
public:
int evalRPN(vector<string>& tokens) {
// 力扣修改了后台测试数据,需要用long long
stack<long long> st; // 使用long long类型的栈,以防溢出
// 遍历逆波兰表达式的每个元素
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
// 如果是运算符,则弹出栈顶的两个数进行运算,并将结果入栈
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
if (tokens[i] == "+") st.push(num2 + num1);
if (tokens[i] == "-") st.push(num2 - num1);
if (tokens[i] == "*") st.push(num2 * num1);
if (tokens[i] == "/") st.push(num2 / num1);
} else {
// 如果是数字,则将其转换为long long类型并入栈
st.push(stoll(tokens[i]));
}
}
// 最终栈中只剩下一个元素,即为逆波兰表达式的结果
int result = st.top();
st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
return result;
}
};