这是关于栈和队列的经典应用
20. 有效的括号(输入数据要合法)
简单的通过栈来模拟
代码如下
class Solution {
public:
bool isValid(string s) {
stack <char> St;//定义栈类型为char!
if (s.size() % 2 != 0) return false;//不配对直接返回false
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( '}' );//输入对应的括号!
//下面,如过在for遍历未结束前St为空的话,或者括号不对应返回false
else if (St.empty() || s[i] != St.top() ) return false;
else (St.pop() );//如果不是上面的情况,把对应的pop
}
return St.empty();//遍历后,栈为空则返回真,非空则返回假
}
};
1047. 删除字符串中的所有相邻重复项
简单理解:相邻字母相同,进行消消乐
代码如下
class Solution {
public:
string removeDuplicates(string s) {
string News;
for(char z : s)
{
if(News.empty() || News.back() != z)//如果为空(第一次),或者字母不相同添加字母
{
News.push_back(z) ;
}else{//如果相同,pop字母
News.pop_back() ;
}
}
return News;//最后返回字符串
}
};
150.逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,““,”/“,””,“17”,“+”,“5”,“+”]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
class Solution {
public:
int evalRPN(vector<string>& s) {
stack <long long > ST;
for(int i=0;i<s.size();i++)
{
if(s[i]== "+" || s[i]=="-" || s[i]=="*" || s[i]== "/")
{
long long n1=ST.top();ST.pop();//这里已经把字符类型转换成long long类型了
long long n2=ST.top();ST.pop();//n1, n2存运算符前的数字
//下面是进一步判断符号进行运算
if(s[i]=="+") ST.push(n1+n2);
else if(s[i]=="-") ST.push( n2-n1 );
else if(s[i]=="*") ST.push( n1*n2 );
else if(s[i]=="/") ST.push( n2/n1 );
}
else ST.push(stoll(s[i]));//stoll是将strin转换成long long 类型的函数
}
int a=ST.top();//最终第一个为我们所要的值
ST.pop();
return a;//返回即可
}
};