一、有效的括号(力扣20题)
bool isValid(string s) {
int n=s.size();
if(n%2!=0) return false;
stack<char> cs;
for(char ch : s)
{
if(ch=='('||ch=='['||ch=='{')
{
cs.push(ch);
}
else
{
if(cs.empty()) return false;
char cmp=cs.top();
cs.pop();
if(ch==')'&&cmp!='('||ch==']'&&cmp!='['||ch=='}'&&cmp!='{')
{
return false;
}
}
}
return cs.empty();
}
二、逆波兰表达式求值(力扣150题)
int evalRPN(vector<string>& tokens) {
int sum=0;
stack<int> s;
for(string &str :tokens)
{
if(str.size()==1&&(str[0]=='+'||str[0]=='-'||str[0]=='*'||str[0]=='/'))
{
int r=s.top();
s.pop();
int l=s.top();
s.pop();
s.push(calc(l,r,str[0]));
}
else
{
s.push(stoi(str));
}
}
return s.top();
}
三、中缀转后缀表达式
#include<iostream>
#include<string>
#include<stack>
using namespace std;
//比较符号优先级
bool Priority(char ch, char topch)
{
if ((ch == '*' || ch == '/') && (topch == '+' || topch == '-'))
return true;
if (topch == '('&&ch!=')')
return true;
return false;
}
//中缀表达式转后缀表达式
string MiddleToEndExpr(string expr)
{
string result;
stack<char> s;
for (char ch : expr)
{
if (ch >= '0' && ch <= '9')
{
result.push_back(ch);
}
else//处理符号
{
while (1)
{
if (s.empty() || ch == '(')
{
s.push(ch);
break;
}
//比较当前符号ch和栈顶符号top的优先级
char topch = s.top();
//true ch>topch false ch<=topch
if (Priority(ch, topch))
{
s.push(ch);
break;
}
else
{
s.pop();
if (topch == '(') break;
result.push_back(topch);
}
}
}
}
//如果符号栈还存留符号,直接输出到后缀表达式里面
while (!s.empty())
{
result.push_back(s.top());
s.pop();
}
return result;
}
int main() {
cout << MiddleToEndExpr("(1+2)*(3+4)") << endl;
cout << MiddleToEndExpr("2+(4+6)/2+6/3") << endl;
return 0;
}
总结
今天主要给大家说了一些,栈的常用算法题,主要利用了栈先进后出的概念。