最好的我们! 2024-04-14 23:34 采纳率: 50%
浏览 5

表达式求值,为什么我的函数没有输出?哪里错了

表达式求值,为什么我的函数输入1+1=后没有输出?输入样例
3*(9-7)=输出样例6。我的代码哪里写错了?题目要求要利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。


```c
#include<malloc.h>
#include<stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
void  Strcat(char *str1,char *str2);
typedef int SElemType;
typedef int Status;

struct SqStack
{
    SElemType *base;
    SElemType *top;
    int stacksize;
};

Status InitStack(SqStack &S)
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
        return ERROR;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

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 ERROR;
        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;
}
Status Pop1(SqStack &S,char &e)
{
    e=*--S.top;
    return OK;
}

Status GetTop(SqStack S)
{
    if(S.top==S.base)
        return ERROR;
    //int e=*(S.top-1);
    return OK;
}

Status GetTop1(SqStack S)
{
    if(S.top==S.base)
        return ERROR;
    int e=*(S.top-1);
    printf("%d\n",e);
    return OK;
}

int StackLength(SqStack S)
{
    int i;
    i=S.top-S.base;
    return i;
}

Status StackTraverse(SqStack S)
{

    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;
    if(S.top==S.base)
        printf("The Stack is Empty!");
    else
    {
        printf("The Stack is: ");
        p--;
        while(p>=S.base)
        {
            printf("%d ", *p);
            p--;
        }
    }
    printf("\n");
    return OK;
}

int In(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='#'||c=='\n')
        return 1;

    else
        return 0;
}

unsigned char prior[7][7] =
{
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=',' '},
    {'<','<','<','<','<',' ','>'},
    {'<','<','<','<','<',' ','='}
};

char OPSET[9] = {'+','-','*','/','(',')','#','\n','='};

void  Strcat(char *str1,char *str2)
{
    int i = 0, j = 0;
    while(str1[i]!='\0')
    {
        i++;
    }
    while(str2[j]!='\0')
    {
        str1[i++] = str2[j++];
    }
    str1[i] = '\0';

}


Status Precede(int a,char b)
{
    int i = 0,j = 0;
    while(OPSET[i] != a)
    {
        i++;
    }
    while(OPSET[j] != b)
    {
        j++;
    }
    return prior[i][j];
}

int Operate(int a,char theta,int c)
{
    if (theta == '/' && c == 0)
    {
        printf("Error: Division by zero\n");
        return 0;
    }
    switch(theta)
    {
    case '+':
        return a+c;
    case '-':
        return a-c;
    case '*':
        return a*c;
    case '/':
        return a/c;
    }

}
Status Atoi(char *c)
{
    int data=0;
    char *p=c;
    while (*p!='=')
    {
        data = data * 10 + (*p - '0');
        p++;
    }

    return data;
}

int main()
{
    SqStack OPTR,OPND;
    InitStack(OPTR);
    InitStack(OPND);
    char a[1000000],x,theta;
    char *p=a;
    gets(a);
    int m,n,num=0;
    Push(OPTR,'#');
    char data[1000000];
    data[0]='\0';
    char tmp[2];
    while(*p!='='||GetTop(OPTR)!='#') //也有可能是已经到等号,但栈里面还有其他的运算符
    {
        if(!In(*p))//是运算数
        {
            tmp[0]=*p;
            tmp[1]='\0';
            Strcat(data,tmp);
            p++;
            if(In(*p))//是运算符
            {
                num=Atoi(data);
                Push(OPND,num);
                data[0]='\0';
            }

        }
        else
        {
            switch(Precede(GetTop(OPTR),*p))
            {
            case '<':
                Push(OPTR,*p);
                p++;
                break;
            case '>':
                Pop1(OPTR,theta);
                Pop(OPND,n);
                Pop(OPND,m);
                Push(OPND,Operate(m,theta,n));
                break;
            case '=':
                Pop1(OPTR,x);
                p++;
                break;
            }
        }
    }
    while (GetTop(OPTR) != '#')
    {
        Pop1(OPTR, theta);
        Pop(OPND, n);
        Pop(OPND, m);
        Push(OPND, Operate(m, theta, n));
    }

    GetTop1(OPND);
    return 0;
}



  • 写回答

6条回答 默认 最新

  • 百锦再@新空间 优质创作者: 编程框架技术领域 2024-04-15 00:39
    关注

    在你的代码中,存在一些问题导致程序没有正确输出结果。首先,在你的代码中,Strcat函数定义了两次,这是不被允许的,只需定义一次即可。接着,你在代码中定义了一些结构体和函数,但是在主函数中没有调用这些函数,因此程序没有执行相应的操作。另外,在主函数中,你使用了gets函数来获取输入,但这个函数不安全,最好使用fgets函数。此外,你在使用malloc函数分配内存时,没有进行错误检查。最后,在计算表达式时,你需要对所有输入进行逐步处理,确保每一步操作都正确。希望这些指导对你有所帮助。如果你有任何疑问或需要进一步的解释,请随时告诉我。


    有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
    评论

报告相同问题?

问题事件

  • 创建了问题 4月14日