目录
1:前缀表达式解释
2:前缀表达式代码展现
1:前缀表达式解释
前缀表达式是什么呢?平时我们用的表达式是8+8-9=7这样子的表达式,这个叫中缀表达式,是我们平时所用的表达式,有中自然就有前和后了,但是这篇文章我们只讲前缀表达式滴。
前缀表达式我们的一般样子是: + + 2 * 3 - 7 4 / 8 4
将它转换成中缀表达式为2+3*(7-4)+8/4
那么该如何转换呢,这里就要用到栈的知识(先进后出)
从右往左开始(你问我为什么,嘿嘿我也不知道)遇到数字4进栈,继续,遇到8进栈,继续,遇到了符号 /,这时候就要开始计算了,将栈顶元素8弹出,然后在弹出栈顶元素4,计算8/4=2,那么计算结果2进栈,现在栈内只有2了,继续,遇到4,进栈,栈中{4,2},继续,7进栈,栈中{7,4,2},继续,遇到符号-,取出栈顶元素7,弹出,再取一个栈顶元素4,在弹出,计算7-4=3,将计算结果3进栈,栈中{3,2},继续,3进栈,栈中{3,3,2},继续,遇到 *,还是弹出栈顶元素,然后再弹出一个栈顶元素,计算,3*3=9,将计算结果9进栈,栈中{9,2},继续,2进栈,栈中{2,9,2},继续,遇到 +,还是弹出栈顶元素,在弹出一个栈顶元素,进行计算,2+9=11,将计算结果11进栈,栈中{11,2},继续,遇到+,计算栈中仅存的2个元素了,11+2=13。
这就是前缀表达式的一个具体思路了,更细节的话还有什么括号啊,符号和数字数不匹配啊,无法形成中缀表达式计算等等就不讨论了,这里我主要是教会大家什么是前缀表达式,如何理解前缀表达式的。
2:前缀表达式代码展现
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
stack<int>q;
getline(cin,s);
int l=s.size();
int f=0;
for(int i=l-1;i>=0;i--){
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
if(q.size()<2){
f=1;
break;
}
int sum;
int n1=q.top();
q.pop();
int n2=q.top();
q.pop();
if(s[i]=='+')sum=n1+n2;
else if(s[i]=='-')sum=n1-n2;
else if(s[i]=='*')sum=n1*n2;
else if(s[i]=='/'){
if(n2==0){
f=1;
break;
}
else{
sum=n1/n2;
}
}
q.push(sum);
}
else if(s[i]==' ')continue;//空格进行下一次的循环
else{
//数
int a=s[i]-'0';//从字符型转换成整型
q.push(a);
}
}
if(q.size()!=1)f=1;
if(q.size()==1)cout<<q.top();
if(f==1){
cout<<"ERROR";
return 0;
}
return 0;
}