20. 有效的括号
括号匹配三种错误情况:左右括号类型不匹配;右括号比左括号多,右括号会遇到空栈;左括号比右括号多,多的左括号会留在栈内。
class Solution {
public:
stack<char> st;
bool isValid(string s) {
for(int i=0;i<s.size();++i)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
st.push(s[i]);
}
else if(s[i]==')'||s[i]==']'||s[i]=='}')
{
if(st.empty())return false;//右括号遇空栈
char c=st.top();
cout<<c<<endl;
switch (c)
{
case '(':
if(s[i]!=')')return false; //不匹配
break;
case '[':
if(s[i]!=']')return false;
break;
case '{':
if(s[i]!='}')return false;
break;
}
st.pop();
}
}
if(!st.empty())return false; //最后还有左括号剩在栈里面
return true;
}
};
1047. 删除字符串中的所有相邻重复项。
遍历字符串,如果栈为空,就把第一个s[0]入栈,否则就跟栈顶元素作比较,如果一样就出栈,如果不一样就把这个元素入栈。
150. 逆波兰表达式求值
用后缀表达式求结果,之前知道用一个符号栈加一个操作数栈。
string转数字用一个函数:stoll。记住类型转化不要自己写函数了。
一开始我用if判断数字,还忘记负数的第一个字符是-,加了之后
if((tokens[i][0]>='0'&&tokens[i][0]<='9')||(tokens[i][0]=='-'))
{
ss.push(stoll(tokens[i]));
}
else//符号
{}
减法就会被误当做负数,所以还是在if里面判断+-*/字符串更方便。
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
if(ss.size()<2)return ss.top();
long long c1=ss.top();
ss.pop();
long long c2=ss.top();
ss.pop();
char ch=tokens[i][0];
switch(ch)
{
case '*':
ss.push(c1*c2);
break;
case '+':
ss.push(c1+c2);
break;
case '-':
ss.push(c2-c1);
break;
case '/':
ss.push((long long)(c2/c1));
break;
default:
break;
}
}
else//符号
{
ss.push(stoll(tokens[i]));
}
注意数得用long long类型。
还有除法和减法的被减数和被除数得是次栈顶不是栈顶!
虽然简单,但是自己要注意的点还挺多的