参考资料:
https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
思路分析:
括号匹配的性质符合 栈 后进先出的特点。
方法:遇到左括号,入栈;遇到右括号,与栈顶元素比较判断。
代码实现:
class Solution {
public:
bool isValid(string s) {
//括号匹配问题 符合栈后进先出的特点
if(s.size()%2!=0) return false;
stack<char> stk;
for(int i=0;i<s.size();i++){
if(s[i]=='(') stk.push(')');
else if(s[i]=='{') stk.push('}');
else if(s[i]=='[') stk.push(']');
//右边的
else if(stk.empty() || s[i]!=stk.top()) return false;//如果栈空,则左边少了
else stk.pop();//匹配
}
return stk.empty();//如果栈不空,左边多了
}
};
题目描述:
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S
仅由小写英文字母组成。
思路分析:
由于栈后进先出,所以栈顶元素就是前一个元素,比较当前元素和栈顶元素
代码实现:
class Solution {
public:
string removeDuplicates(string s) {
//栈,栈顶元素(前一个)与当前元素比较
if(s.size()<=1) return s;
stack<char> stk;
int size=s.size();
stk.push(s[size-1]);
int i=size-2;
while(!stk.empty() && i>=0){
if(s[i]==stk.top()){
stk.pop();
i--;
}
else {
stk.push(s[i]);
i--;
break;
}
}
string str="";
while(!stk.empty()){
str+=stk.pop();
}
return str;
}
};
题目描述:
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
思路分析:
用栈存储数字,遇到非数字的弹出栈中两个数进行操作。
代码实现:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
//栈存数字
stack<long long> st;
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 {
st.push(stoll(tokens[i]));//stoll() 字符串转为long long类型
}
}
return st.top();
}
};