栈和队列
题意:给定一个只包括 '(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号
示例:
思路:本题我有两种思路,1.双栈存储:我们可以使用两个栈分别存储括号的左边和右边,然后在存储右边后,对双栈栈顶进行判断,若括号匹配,则去除左右两边栈顶元素,最后返回双栈的判空情况;2.单栈存储:创建一个栈,用于存储括号的左半部分,然后在遇到右括号时进行判断,若与栈顶元素匹配,则去除栈顶元素,继续判断,若不匹配,则直接返回false
方法1代码:
bool isValid(string s) {
stack<char> arr;
stack<char> tmp;
arr.push('0');
tmp.push('0');
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '{' || s[i] == '[' || s[i] == '(')
{
arr.push(s[i]);
}
else
{
tmp.push(s[i]);
if ((arr.top() == '('&&tmp.top() == ')') || (arr.top() == '{'&&tmp.top() == '}') || (arr.top() == '['&&tmp.top() == ']'))
{
arr.pop();
tmp.pop();
}
}
}
return arr.top() == '0' && tmp.top() == '0';
}
方法2代码:
bool isValid(string s) {
if (s.size() % 2 != 0)
{
return false;
}
stack<char> arr;
for (int i = 0; i<s.size(); i++)
{
if (arr.empty() && (s[i] == '}' || s[i] == ']' || s[i] == ')'))
{
return false;
}
if (s[i] == '{' || s[i] == '[' || s[i] == '(')
{
arr.push(s[i]);
}
else if (s[i] == ')')
{
if (arr.top() == '(')
{
arr.pop();
continue;
}
return false;
}
else if (s[i] == '}')
{
if (arr.top() == '{')
{
arr.pop();
continue;
}
return false;
}
else
{
if (arr.top() == '[')
{
arr.pop();
continue;
}
return false;
}
}
return arr.empty();
}
题意:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
思路:本题我们使用栈的结构特点进行题解,首先我们需要创建一个含底的栈,然后遍历字符串s,当s[i]与栈顶元素相等时,就说明有相邻重复元素,删除栈顶元素,继续向后遍历,当遇到不相等的元素时,加入栈即可;最后我们再将栈中有效元素取出并整体反转,即可得到最终答案
string removeDuplicates(string s) {
stack<char> arr;
for (int i = 0; i<s.size(); i++)
{
if(!arr.empty()&&arr.top()==s[i])
arr.pop();
else
arr.push(s[i]);
}
s.clear();
while(!arr.empty())//当顶部为0时说明到底了
{
s+=arr.top();
arr.pop();
}
reverse(s.begin(),s.end());
return s;
}
题意:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为 '+'、'-'、'*' 和 '/' 。
- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例:
思路:我们使用栈结构特点进行题解,首先建立栈s,用于存储数字,使用stoi对string转换为int类型;当遇到运算符时,取出最上层两个元素进行运算,然后在放回栈顶端,准备下次运算即可,最后输出栈顶元素就是结果
int evalRPN(vector<string>& tokens) {
stack<int> s;
for (int i = 0; i<tokens.size(); i++)
{
if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")//为数字时入栈
{
s.push(stoi(tokens[i]));
continue;
}
int right = s.top();//右操作数,主要是规范减法和除法
s.pop();
int left = s.top();//左操作数
s.pop();
if (tokens[i] == "+")
s.push(left + right);
else if (tokens[i] == "-")
s.push(left - right);
else if (tokens[i] == "*")
s.push(left*right);
else
s.push(left / right);
}
return s.top();
}
标签:tmp,arr,int,top,练习,栈顶,括号,算法,day10
From: https://blog.51cto.com/u_15209404/6508945