菜鸟生成记(54)
首先了解一下后缀表达式这里–>(大佬博客)很详细;
通过这一题又学到一个知识点–后缀表达式
后缀表达式理解后这一题就简单多了,STL大法暴力模拟;
#include <iostream>
#include<vector>
#include<string>
#include <stack>
#include <algorithm>
using namespace std;
int fun(string s)
{
for(int i=0;i<s.length();i++)
if(!isdigit(s[i]))
return 0;
return 1;
}
int fun1(string s)
{
for(int i=0;i<s.length();i++)
if(isdigit(s[i]))
return 0;
return 1;
}
void f(string &num1,string &str,string t)
{
int i=0;
for(i=0;i<t.length();i++)
if(isdigit(t[i]))
break;
str=t.substr(0,i);
num1=t.substr(i);
}
int main()
{
string s1,t,num1,str;
int x,y,sum,num=0;
vector<string>s;
stack<int>st;
cin>>s1;
for(int i=0;i<s1.length();i++)
{
if(s1[i]!='.'&&s1[i]!='@')
t.push_back(s1[i]);
else
{
if(fun(t))
{
s.push_back(t);
}
else if(fun1(t))
{
s.push_back(t);
}
else if(!fun(t)&&!fun1(t))
{
f(num1,str,t);
s.push_back(str);
s.push_back(num1);
}
t.clear();
}
}
for(int i=0;i<s.size();i++)
{
num=0;
if(fun(s[i]))
{
for(int j=0;j<=s[i].length()-1;j++)
{
num=num*10+(s[i][j]-'0');
}
st.push(num);
}
else
{
for(int j=0;j<s[i].size();j++)
{
y=st.top(),st.pop();
x=st.top(),st.pop();
switch(s[i][j])
{
case '+':
sum=x+y;
break;
case '-':
sum=x-y;
break;
case '*':
sum=x*y;
break;
case '/':
sum=x/y;
break;
}
st.push(sum);
}
}
}
cout<<st.top();
return 0;
}