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;
}`