当前位置: 代码迷 >> 综合 >> 1022. 波兰表达式
  详细解决方案

1022. 波兰表达式

热度:86   发布时间:2023-12-06 11:29:59.0

在这里插入图片描述
在这里插入图片描述思路:
这道题目首先要解决的是理解前缀表达式
前提:随便给一个前缀表达式都能看懂+能手算
不难发现,把这一串表达式依次push到栈里面,一旦一个符号后面跟着两个数字就直接进行计算,然后替代符号的位置

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int maxx=-0x3f3f3f3f;
char s[1111];
double a[1111];
double ans;
struct DATA
{
    bool fuhao;double shuzi;
};
struct STACK
{
    int cnt;DATA data[1111111];void init(){
    cnt=0;}double  top(){
    return data[cnt].shuzi;}double top1(){
    return data[cnt-1].shuzi;}double top2(){
    return data[cnt-2].shuzi;}int size(){
    return cnt;}void pop(){
    cnt--;}void push(const double  &x){
    cnt++;data[cnt].shuzi=x;}
}st;
int main()
{
    gets(s);int l=strlen(s);//cout<<l<<endl;int cntt=1;for(int i=0;i<l;i++){
    //cout<<"s[i]="<<s[i]<<endl;if(s[i]==' ') continue;if(s[i]=='+'){
    a[cntt]=-1;cntt++;continue;}if(s[i]=='-'){
    a[cntt]=-2;cntt++;continue;}if(s[i]=='*'){
    a[cntt]=-3;cntt++;continue;}if(s[i]=='/'){
    a[cntt]=-4;cntt++;continue;}double tempx=0,tempy,cnt=0,flag=0;if(s[i]>='0'&&s[i]<='9'){
    flag=1;tempx=tempx*10+s[i]-'0';while(s[i+1]!=' '&&i!=l-1){
    if(s[i+1]=='.'){
    i++;cnt++;}if(s[i+1]>='0'&&s[i+1]<='9'){
    i++;if(cnt==0) tempx=tempx*10+s[i]-'0';else{
    tempy=s[i]-'0';for(int j=1;j<=cnt;j++){
    tempy/=10;}cnt++;tempx+=tempy;}}}} //cout<<"tempx="<<tempx<<endl;if(flag){
    a[cntt]=tempx;cntt++;} }//for(int i=1;i<cntt;i++) cout<<a[i]<<" ";//cout<<endl;//cout<<st.data[5]<<endl;for(int i=1;i<cntt;i++){
    st.push(a[i]);if(a[i]<0){
    st.data[st.size()].fuhao=1;//cout<<"fuhao"<<st.size()<<endl;} while(st.size()>=3&&st.data[st.size()].fuhao==0&&st.data[st.size()-1].fuhao==0&&st.data[st.size()-2].fuhao==1){
    double ans=0;if(st.top2()==-1){
    ans=st.top()+st.top1();}if(st.top2()==-2){
    ans=st.top1()-st.top();}if(st.top2()==-3){
    ans=st.top1()*st.top();}if(st.top2()==-4){
    ans=st.top1()/st.top();}st.pop();st.pop();st.pop();st.push(ans);st.data[st.size()].fuhao=0;//cout<<ans<<endl;//cout<<"st.size()"<<st.size()<<endl;}}if(st.size()==1) printf("%.6f",st.top());return 0;
}