请问为什么这个代码输出总是35

#include <stdio.h>
#include <malloc.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef char SElemType;
typedef struct {
    SElemType* base;
    SElemType* top;
    int stacksize;
}SqStack;
typedef int Status;
void InitStack(SqStack& S) {
    S.base = (SElemType*)malloc(stack_init_size * sizeof(SElemType));
    S.top = S.base;
    S.stacksize = stack_init_size;

}

char GetTop(SqStack S, SElemType& e) {
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return e;
}

Status Push(SqStack& S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {
        S.base = (SElemType*)realloc(S.base, (S.stacksize + stackincrement) * sizeof(SElemType));
        if (!S.base) return OVERFLOW;
        S.top = S.base + S.stacksize;
        S.stacksize += stackincrement;
    }
    *S.top++ = e;
    return OK;
}

Status Pop(SqStack& S, SElemType& e) {
    if (S.top == S.base)return ERROR;
    e = *--S.top;
    return OK;
}

char Precede(SElemType s1, char s2) {
    char f;
    switch (s2)
    {
    case '+':if (s1 == '(' || s1 == '#')f = '<';
            else f = '>'; break;
    case '-': if (s1 == '#' || s1 == '(') f = '<';
            else f = '>'; break;
    case '*':if (s1 == '*' || s1 == '/' || s1 == ')')f = '>';
            else f = '<'; break;
    case '/': if (s1 == '*' || s1 == '/' || s1 == ')')f = '>';
            else f = '<'; break;
    case '(': if (s1 == ')')
    {
        printf("ERROR 1 !");
        return ERROR;
    }
            else f = '<'; break;
    case ')': if (s1 == '#')
    {
        printf("ERROR 2 !");
        f = ERROR;
    }
            else
    {
        if (s1 == '(')
            f = '=';
        else
            f = '>';
    }break;
    case '#': if (s1 == '(')
    {
        printf("ERROR 3 !");
        f = ERROR;
    }
            else
    {
        if (s1 == '#')
            f = '=';
        else
            f = '>';
    }
            break;
    default: printf("ERROR 4 !");
        f = ERROR;
    }
    return f;
}
int In(char c, SqStack OPTR) {
    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#')return 1;
    else return 0;
}
int Operate(char a, char theta, char b) {
    switch (theta) {
    case '+':return(a - 48) + (b - 48); break;
    case '-':return a - b; break;
    case '*':return(a - 48) * (b - 48); break;
    case '/':return (a - 48) / (b - 48); break;
    default:return 0;
    }
}
typedef int OperandType;
OperandType EvaluateExression() {
    SqStack OPTR, OPND;
    InitStack(OPTR);
    Push(OPTR, '#');
    InitStack(OPND);
    char c = getchar();
    char e;
    while (c != '#' || GetTop(OPTR, e) != '#') {
        if (In(c, OPTR)) {
            Push(OPND, c);
            c = getchar();
        }
        else {
            char x, theta, a, b;
            switch (Precede(GetTop(OPTR, e), c)) {
            case'<': Push(OPTR, c); c = getchar(); break;
            case'=': Pop(OPTR, x); c = getchar(); break;
            case'>':
                Pop(OPTR, theta);
                Pop(OPND, b);
                Pop(OPND, a);
                int value = Operate(a, theta, b);
                Push(OPND, value); break;

            }
        }return GetTop(OPND, e);
    }
}

int main()
{
    int result;

    printf("请输入算式:\n");
    result = EvaluateExression();
    printf("结果是:%d\n", result);
    return 0;
}

你的测试数据是什么?

你做了哪些调试?

int In(char c) {        //判断输入是不是数字,参数一个c就够????????????????????
    if(48<=c && c<=57) return 1;
    else return 0;
}
typedef int OperandType;
OperandType EvaluateExression() {
    SqStack OPTR, OPND;
    InitStack(OPTR);
    Push(OPTR, '#');
    InitStack(OPND);
    char c = getchar();
    char e;
    while (c != '#' || GetTop(OPTR, e) != '#') {
        if (In(c)) {         //判断输入是不是数字,参数一个c就够????????????????????????
            Push(OPND, c);
            c = getchar();
        }
        else {
            char x, theta, a, b;
            switch (Precede(GetTop(OPTR, e), c)) {
                case'<': Push(OPTR, c); c = getchar(); break;
                case'=': Pop(OPTR, x); c = getchar(); break;
                case'>':
                    Pop(OPTR, theta);
                    Pop(OPND, b);
                    Pop(OPND, a);
                    int value = Operate(a, theta, b);
                    Push(OPND, (char)(value+48)); break;    //value是整型,需要+48变成字符然后再Push?????????????????????
            }
        }
    }
    return GetTop(OPND, e)-48;//写在while里面了,挪出来。记得-48因为栈数据类型是字符??????????????????????????????
}

标记的四处地方进行修改就可以啦。

下面是结果,忽略乱码汉字我没调编码,看结果。

你的栈用char类型,就导致输入的数字只能是个位数。改成double的话就可以用多位数不过数字大了容易出问题,也需要再增加一个判断是否是多位数。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html