要点
1.准备好一个栈
2.当给出一个字符串 需要你将元素push的时候 如果这个字符是整数的话 可以直接输出
3.当遇到操作符的时候,一定要比较 比较 比较 (重要的事情说三遍) 在操作符的栈里面一定要满足一个条件 就是从顶到底优先级必须严格减小
4.接着就是对于括号的处理,如果遇到的是左括号,直接入栈 遇到右括号,不断取出栈顶元素,直到取到左括号
5.输出栈中的所有元素。
//逆波兰式
#include<bits/stdc++.h>
using namespace std;
int youxian(char op)
{
if (op=='+' || op=='-')
{
return 1;
}
if(op=='*' || op=='/')
{
return 2;
}
if(op=='(')
{
return 0;
}
}
int main()
{
int num=0;
string s1="";
stack<char>op;
string s;
s="2+4*8+(8*8+1)/3";
for(int i=0;i<s.length();i++)
{
if(isdigit(s[i]-'0'))
{
s1+=s[i];
}
else
{
if(s.empty())
{
op.push(s[i]);
}
else if(s[i]=='(')
{
op.push(s[i]);
}
else if(s[i]==')')
{
while(op.top()!='(')
{
s1+=op.top();
op.pop();
}
op.pop();
}
else
{
if(youxian(s[i])>youxian(op.top()))
{
op.push(s[i]);
}
else
{
while(youxian(s[i])<=youxian(op.top()))
{
s1+=op.top();
op.pop();
}
op.push(s[i]);
}
}
}
}
while(!op.empty())
{
s1+=op.top();
op.pop();
}
cout<<s1<<endl;
}
自己打的一段后缀表达式 还是比较好理解的
然后可以依据后缀表达式求解
//逆波兰式求解
stack<float>sum;
int x1=0;
int x2=0;
int y=0;
int result=0;
for(int i=0;i<s1.length();i++)
{
if(s1[i]>='0' && s1[i]<='9')
{
sum.push(s1[i]-'0');
}
else
{
result=0;
x1=0;
x2=0;
x1=sum.top();
sum.pop();
x2=sum.top();
sum.pop();
if(s1[i]=='+')
{
result=x1+x2;
}
else if(s1[i]=='-')
{
result=x2-x1;
}
else if(s1[i]=='*')
{
result=x2*x1;
}
else if(s1[i]=='/')
{
result=x2/x1;
}
sum.push(result);
}
}
while(!sum.empty())
{
printf("%.1f",sum.top());
sum.pop();
}
}
这里我写的是最简单的一个位的四则运算 之后会更新更复杂点的四则运算