【数据结构】--表达式求解----完整版

 数据结构之表达式求解----完整版(无敌完整版)

(1) 运算符包括:+、-、*、-、^(乘方)、括号

(2)实数(包括多位整数各种);

 

表达式的书写形式

中缀--日常写的,但是他的计算方式较为复杂

前缀--计算机一般存储结构

后缀--日常计算的方式----一遍编写计算器都是通过后缀表达式+栈来解决--其符号优先级大于左边也高于右边,则可以计算此运算符


 

 

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxsize=100005;
struct node_optr
{
    char data[maxsize];
    int top;
} optr; ///存运算符的
struct node_oprd
{
    double data[maxsize];
    int top;
} oprd; ///存操作数据的

void exp_trans(char exp[],char post_exp[])///前缀表达式转化为后缀表达式
{
    //printf("exp_trans\n");
    int i=0,j=0;
    char ch=exp[i++];
    optr.top=-1;
    while(ch!='=')
    {
        // printf("ch %c\n",ch);
        if(ch=='(')///左括号直接push进optr.data
        {
            optr.data[++optr.top]=ch;
        }
        else if(ch==')')///右括号的话就是把oprd里面的数据全部pop出来,直到为empty或者遇到“左括号”
        {

            while(optr.data[optr.top]!='('&&optr.top!=-1)
            {
                post_exp[j++]=optr.data[optr.top--];///post_exp从1开始存储
                if(optr.top==-1)break;
            }
            optr.top--;
        }
        else if(ch=='+'||ch=='-')
        {
            while(optr.data[optr.top]!='(' && optr.top!=-1)
            {
                post_exp[j++]=optr.data[optr.top--];
            }
            optr.data[++optr.top]=ch;
        }
        else if(ch=='*'||ch=='/')
        {
            while(optr.data[optr.top]!='(' && optr.top!=-1 &&(optr.data[optr.top]=='*'||optr.data[optr.top]=='/'))
            {
                post_exp[j++]=optr.data[optr.top--];
            }
            optr.data[++optr.top]=ch;
        }
        else if(ch=='^')///优先度很高
        {
            optr.data[++optr.top]=ch;
            //post_exp[j++]=ch;
        }
        else
        {
            while((ch>='0'&&ch<='9')||ch=='.')
            {
                post_exp[j++]=ch;
                ch=exp[i++];
            }
            i--;
            post_exp[j++]='#';///断开整数
        }
        ch=exp[i++];
    }
    while(optr.top!=-1)
    {
        post_exp[j++]=optr.data[optr.top--];
    }
    post_exp[optr.top--]=='\0';///结束标志
}
void cal_exp(char post_exp[])
{
    //printf("void cal_exp\n");
    int num;
    char ch;
    int i=0;
    oprd.top=-1;
    ch=post_exp[i++];
    while(ch!='\0')///后缀表达式没有结束
    {
        //printf("ch %c\n",ch);
        ///运算时一定要注意-和/,先入栈的为减数(除数),后入栈的是被减数(被除数);
        if(ch=='+')
        {
            oprd.data[oprd.top-1]=oprd.data[oprd.top]+oprd.data[oprd.top-1];
            oprd.top--;
        }
        else if(ch=='-')
        {
            oprd.data[oprd.top-1]=oprd.data[oprd.top-1]-oprd.data[oprd.top];
            oprd.top--;
        }
        else if(ch=='*')
        {
            oprd.data[oprd.top-1]=oprd.data[oprd.top]*oprd.data[oprd.top-1];
            oprd.top--;
        }
        else if(ch=='/')
        {
            if(oprd.data[oprd.top]==0)
            {
                printf("被除数不能为0\n");
                return ;
            }
            else
            {
                oprd.data[oprd.top-1]=oprd.data[oprd.top-1]*1.0/oprd.data[oprd.top];
                oprd.top--;
            }
        }
        else if(ch=='^')
        {
            //cout<<"oprd.data[oprd.top]"<<oprd.data[oprd.top]<<" ";
            //cout<<"oprd.data[oprd.top-1]"<<oprd.data[oprd.top-1]<<" ";
            //cout<<endl;
            oprd.data[oprd.top-1]=pow(oprd.data[oprd.top-1],oprd.data[oprd.top]);
            oprd.top--;
            //cout<<oprd.data[oprd.top]<<endl;
            ///1+2^3+3^2=
        }
        else
        {
            double num=0;
            int f=0;
            double temp=0.1;
            while((ch>='0'&&ch<='9')||ch=='.')
            {
                if(f==0&&ch=='.') f=1;
                else
                {
                if(f==0) num=num*10+ch-'0';
                else if(f) num=num+temp*(ch-'0'),temp*=0.1;
                }
                ch=post_exp[i++];

            }
            oprd.data[++oprd.top]=num;
            //printf("num %d\n",num);
        }
        ch=post_exp[i++];
    }
}
int main()
{
    char exp[maxsize];
    scanf("%s",exp);
    char post_exp[maxsize];
    exp_trans(exp,post_exp);
    printf("post_exp %s\n",post_exp);
    cal_exp(post_exp);
    double ans=oprd.data[oprd.top];
    if(fabs(ans-floor(ans))<0.00001) printf("%.f",ans);
    else printf("%.5f",ans);

    return 0;
}

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值