L0405oue 2023-03-19 20:57 采纳率: 50%
浏览 16
已结题

c++,中缀法表达式求值

c++用2个栈,中缀法表达式求值
不知道错在哪了

#include <bits/stdc++.h>

using namespace std;

stack<char>oprt;
stack<double>opnd;

char f[1000]={'\0'};
double num[1000]={0};

char Compare(char a,char b)
{
    switch(a)
    {
        case '+':switch(b)
        {
            case '+':return '>';
            case '-':return '>';
            case '*':return '<';
            case '/':return '<';
            case '(':return '<';
            case ')':return '>';
            case '#':return '>';
        }
        case '-':switch(b)
        {
            case '+':return '>';
            case '-':return '>';
            case '*':return '<';
            case '/':return '<';
            case '(':return '<';
            case ')':return '>';
            case '#':return '>';
        }
        case '*':switch(b)
        {
            case '+':return '>';
            case '-':return '>';
            case '*':return '>';
            case '/':return '>';
            case '(':return '<';
            case ')':return '>';
            case '#':return '>';
        }
        case '/':switch(b)
        {
            case '+':return '>';
            case '-':return '>';
            case '*':return '>';
            case '/':return '>';
            case '(':return '<';
            case ')':return '>';
            case '#':return '>';
        }
        case '(':switch(b)
        {
            case '+':return '<';
            case '-':return '<';
            case '*':return '<';
            case '/':return '<';
            case '(':return '<';
            case ')':return '=';
        }
        case ')':switch(b)
        {
            case '+':return '>';
            case '-':return '>';
            case '*':return '>';
            case '/':return '>';
            case '(':return '=';
            case ')':return '>';
            case '#':return '>';
        }
        case '#':switch(b)
        {
            case '+':return '<';
            case '-':return '<';
            case '*':return '<';
            case '/':return '<';
            case '(':return '<';
            case ')':return '<';
            case '#':return '=';
        }
    }
}

double Operat(double a,char b,double c)
{
    switch(b)
    {
        case '+':return a+c;
        case '-':return a-c;
        case '*':return a*c;
        case '/':return a/c;
    }
}

double Translation(char a[])
{
    int len,i,j,k;
    double sum=0,t;
    len=strlen(a);
    for(i=0;i<len;i++)
    {
        if(a[i]!='.')
        {
            t=a[i]-'0';
            sum=sum*10+t;
        }
        else
        {
            j=i;
            break;
        }
    }
    for(i=j+1;i<len;i++)
    {
        t=a[i]-'0';
        for(k=0;k<i-j;k++)
        {
            t*=0.1;
        }
        sum+=t;
    }
    return sum;
}

void Fun(char a[])
{
    int i,j=0,k,m=0,n=0,len;
    char s[1000];
    len=strlen(a);
    for(i=0;i<len;i++)
    {
        if(a[i]!='.'&&(a[i]<'0'||a[i]>'9'))
        {
            f[j++]=a[i];
        }
        else
        {
            for(k=i;k<len;k++)
            {
                if(a[k]!='.'&&(a[k]<'0'||a[k]>'9'))
                {
                    i=k;
                    num[n++]=Translation(s);
                    break;
                }
                else
                {
                    s[m++]=a[k];
                }
            }
        }
    }
}

double Evaluateexpression()
{
    int i=0,j=1;
    double a,c;
    char b;
    opnd.push(num[0]);
    oprt.push('#');
    while(!oprt.empty())
    {
        switch(Compare(oprt.top(),f[i++]))
        {
        case '<':
            opnd.push(num[j++]);
            oprt.push(f[i]);
            break;
        case '>':
            c=opnd.top();
            b=oprt.top();
            opnd.pop();
            oprt.pop();
            a=opnd.top();
            opnd.pop();
            opnd.push(Operat(a,b,c));
            break;
        case '=':
            oprt.pop();
            break;
        }
    }
    return opnd.top();
}

int main()
{
    char expression[1000];
    int i,j,k,len;
    cin>>expression;
    len=strlen(expression);
    if(expression[0]=='-')
    {
        for(i=len;i>0;)
        {
            expression[i]=expression[--i];
            expression[0]='0';
        }
        len++;
    }
    for(i=1;i<len;i++)
    {
        if((expression[i-1]=='('||expression[i-1]==')')&&expression[i]=='-')
        {
            for(j=len;j>i;)
            {
                expression[j]=expression[--j];
            }
            expression[i]='0';
        }
    }
    Fun(expression);
    cout<<Evaluateexpression()<<endl;
}

  • 写回答

2条回答 默认 最新

  • lshen01 2023-03-19 21:01
    关注

    参考GPT和自己的思路:

    这份代码存在一些问题,具体如下:

    1. Fun() 函数中,当遇到数字时应将其转化为 double 类型,并将其压入 num 数组中,但是现在将其直接存入了字符数组 s 中,没有进行转换。

    2. Evaluateexpression() 函数中,当比较操作符优先级时,应该比较栈顶元素和当前操作符的优先级,但是现在比较的是栈顶操作符和当前操作符的优先级。

    3. Evaluateexpression() 函数中,当比较操作符优先级后,应该将当前操作符入栈,但是现在入栈的是下一个操作数。

    4. main() 中,若表达式以符号 "-" 开始,应该将其移动到字符串末尾,并在字符串头部插入数字 0,但是现在将符号 "-" 移动到字符串末尾,并没有在字符串头部插入数字 0。

    5. main() 中,若表达式中出现类似于()-1 这样的形式,需要在表达式中插入一个 0,变成()0-1 的形式,但是现在插入失败。

    另外,存在一些不太规范的写法,比如全局变量和使用了 bits/stdc++.h 头文件。建议优化后再使用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月19日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: