拾三小白 2022-03-06 17:15 采纳率: 50%
浏览 9
已结题

C语言,顺序栈实现算术表达式,最后输出值不对

img

bool in(char c)
{
    if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')'|| c == '#')
        return true;
    else
        return false;
}

char operate(char c1,char tha, char c2)
//注意c1\c2顺序要与表达式一致
{
    switch(tha)
    {
        case '+':return (c1 - '0')+(c2 - '0');
        case '-':return (c1 - '0')-(c2 - '0');
        case '*':return (c1 - '0')*(c2 - '0');
    }
    return (c1 - '0')/(c2 - '0');
}

char precede(char a,char b)
{
    char f;
    switch(b)
    {
        case '+':
        case '-':if(a == '(' || a == '#')
                        f = '<';
                    else
                        f = '>';
                    break;
        case '*':
        case '/':if(a == ')'|| a == '*' || a == '/')
                        f = '>';
                    else
                        f = '<';
                break;
        case '(':if(a == ')')
                    {
                        cout << "括号不符合规则!" << endl;
                        exit(-1);
                    }
                    else
                        f = '<';
                    break;
        case ')':switch(a)
                    {
                        case '(':f = '=';
                                break;
                        case '#':
                            {
                                cout << "缺失左括号" << endl;
                                exit(-1);
                            }
                        default:f = '>';
                    }
                    break;
        case '#':switch(a)
        {
            case '(':
                cout << "缺失右括号" << endl;
                exit(-1);
            case '#':f = '=';
                    break;
            default: f = '>';
        }

    }
    return f;
}
char EvalueateExpression()
{
    STACK OPND,OPTR;
    initial(&OPND);
    initial(&OPTR);
    push_stack(&OPTR,'#');
    char c,x,a,b;
    char s[20];
    c = getchar();
    GetTop(&OPTR,s);
    x = s[0];
    while (c != '#' || x != '#')
    {
        if(in(c))
        {
            switch(precede(x,c))
            {
            case '<':
                    push_stack(&OPTR,c);
                    cout << "c= " << c << "   x= " << x <<endl;
                    c =getchar();
                    traverse(&OPND);
                    traverse(&OPTR);
                    break;
            case '=':
                    pop_stack(&OPTR,s);
                    cout << "c= " << c << "   x= " << x <<endl;
                    c = getchar();
                    traverse(&OPND);
                    traverse(&OPTR);

                    break;
            case '>':
                    pop_stack(&OPTR,s);
                    x = s[0];
                    pop_stack(&OPND,s);
                    b = s[0];
                    pop_stack(&OPND,s);
                    a = s[0];
                    push_stack(&OPND,operate(a,x,b));
                    traverse(&OPND);
                    traverse(&OPTR);
                    cout << "c= " << c << "   x= " << x <<endl;
            }
        }
        else if(c >= '0' && c <= '9')
        {
            push_stack(&OPND,c);
            cout << "c= " << c << "   x= " << x <<endl;
            c = getchar();

        }
        else
        {
            cout << "出现非法字符!" << endl;
            cout << "c= " << c << "   x= " << x <<endl;
            exit(-1);
        }
        GetTop(&OPTR,s);
        x = s[0];
        cout << "c= " << c << "   x= " << x <<endl;
    }
    traverse(&OPND);
    traverse(&OPTR);
    pop_stack(&OPND,s);
    x = s[0];
    if(!empty_stack(&OPND))
        {
            cout << "表达式有问题!" << endl;
            exit(-1);
        }
    return x;
}
int main()
{
    cout << "输入一个表达式(结果在-127-128之间|中间数在0-9之间): ";
     cout << int(EvalueateExpression()) <<endl;
    return 0;
}`

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月14日
    • 修改了问题 3月6日
    • 创建了问题 3月6日

    悬赏问题

    • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
    • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
    • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
    • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
    • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
    • ¥200 csgo2的viewmatrix值是否还有别的获取方式
    • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
    • ¥15 请把下列每一行代码完整地读懂并注释出来
    • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
    • ¥15 为什么eclipse不能再下载了?