qq_29881289 2021-11-04 10:55 采纳率: 75%
浏览 25
已结题

使用c语言栈完成对算术表达式的正确求值,如下程序可以通过编译,却无法正常运行,如何修改?

在dev c++和vc++中,均能通过编译,但无法正常运行,似乎是陷入死循环,但经检查逻辑没有错误,如何修改才能使其正常输出结果?


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef char stackelm;

 struct stack
{
    stackelm * top;
    stackelm * base;
    int stacksize;
};

void init(stack &s)   //初始化栈
{
    s.base = (stackelm*)malloc(100*sizeof(stackelm));
    s.top = s.base;
    int stacksize = 100;
}

bool stackempty(stack s)  //栈是否为空
{
    if (s.top==s.base)
    return true;
    else
    return false;
}

void push(stack &s, stackelm e)   //入栈操作
{
    *s.top = e;
    *s.top++; 
}

stackelm gettop(stack s, stackelm &e)   //显示栈顶元素
{
    if(s.top>s.base)
    {
    e = *(s.top-1) ;
    return 0;
    }
    else
    return -1;
}

stackelm pop(stack &s, stackelm &e) //出栈操作
{
    if (stackempty(s)==false)
    {
    e = *(s.top-1);
    *s.top--;
    }
    else
    return 1;
}


char precede(stackelm t1, stackelm t2)    //判断t1 t2 两符号的优先级关系
{
    char f;
    switch (t2)
    {
        case '+':
        case '-':    
        if (t1 == '(' || t1 == '\n')
        f = '<';
        else
        f = '>';
        break;
        
        case '*':
        case '/':
        if (t1 == '*' || t1 == '/' || t1 == ')')
        f = '>';
        else
        f = '<';
        break;
        
        case '(':
        if (t1 == ')')
        {
        printf("括号不匹配\n");    
        exit (-1);
        }
        else
        f = '<';
        break;
        
        case ')':
        switch (t1)
        {
            case '(':
            f = '=';
            break;
            
            case '\n':
            printf("缺少左括号\n");
            exit (-1);
            break;
        
            default:
            f = '>';
        }
        
        case '\n':
        switch (t1)
        {
            case '\n':
            f = '=';
            break;
            
            case '(':
            printf("缺少右括号\n");
            exit (-1);
            break;
            
            default:
            f = '>';
        }
        return f;
    }
}

bool in(stackelm c) //判断是否为七种运算符之一
{
    switch (c)
    {
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
        case '\n':
        return true;
        
        default:
        return false;
    }
}

stackelm operate(stackelm a, stackelm x, stackelm b)//进行四则运算
{
    switch (x)
    {
        case '+':
        return a+b;
        
        case '-':
        return a-b;
        
        case '*':
        return a*b;
        
        case '/':
        return a/b;
    }

}

stackelm evaluateexpression()//调用上面的函数进行表达式求值
{
    stack OPTR, OPND;  //OPTR存放运算符,OPND存放运算数
    stackelm a,b,c,x;
    init(OPTR);
    init(OPND);
    push(OPTR,'\n');
    c = getchar();
    gettop(OPTR,x);
    while (c!='\n'||x!='\n')  //使用循环来求值
    {
        if (in(c))
        switch (precede(x,c))
        {
            case '<':
            push(OPTR,c);
            c = getchar();
            break;
            
            case '=':
            pop(OPTR,x);
            c = getchar();
            break;
            
            case '>':
            pop(OPTR,x);
            pop(OPND,b);
            pop(OPND,a);
            push(OPND,operate(a,x,b));
        }
        else if (c >= '0' && c <= '9')
        {
            push(OPND,c-48);
            c = getchar();
        }
        else
        {
            printf("非法字符\n");
            exit (-1);
        }
        gettop(OPTR,x);
    }
    pop(OPND,x);
    if(!stackempty(OPND))
    {
        printf("表达式不正确\n");
        exit (-1);
    }
    return x;  //x为输入表达式的最终运算结果
    
}
int main()
{
    printf("%d",evaluateexpression());
}
  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-11-04 11:04
    关注

    void init(stack &s) //初始化栈
    {
    s.base = (stackelm * )malloc(100 * sizeof(stackelm));
    s.top = s.base;
    int stacksize = 100;
    }
    改为
    void init(stack &s) //初始化栈
    {
    s.base = (stackelm * )malloc(100 * sizeof(stackelm));
    s.top = s.base;
    s.stacksize = 100;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月12日
  • 已采纳回答 11月4日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分