四个卤蛋 2022-09-29 23:23 采纳率: 50%
浏览 64
已结题

C语言 用栈实现后缀表达式求值

这样子用栈有什么问题嘛?
咋没办法实现进栈呢?

img

img

img


完整代码:

#include<stdio.h>
#include<string.h>
#define MAXSIZE 100

typedef struct
{
    int data[MAXSIZE];
    int top;
}stack;

void push(stack S,int z)
{
    S.data[S.top]=z;
    S.top++;
    return;
}
int pop(stack S)
{
    return S.data[--S.top];
}
int main()
{
    stack S;
    S.top=0;
    char bds[20][5]={0};
    char a[5]={0};
    int n=0;
    int x,y;
    for(int i=0;;i++)
    {
        scanf("%s",&a);
        if(a[0]=='#')
            break;
        else
        {
            strcpy(bds[i],a);
            n++;
        }
    }
    for(int i=0;i<n;i++)
    {
        if(bds[i][0]!='+'&&bds[i][0]!='-'&&bds[i][0]!='*'&&bds[i][0]!='/')
        {
            int k=0;
            if(strlen(bds[i])=='1')
                k=bds[i][0]-'0';
            else
            {
                if(bds[i][0]=='-')
                {
                    for(int j=1;j<strlen(bds[i]);j++)
                        k=k*10+(bds[i][j]-'0');
                }
                else
                {
                    for(int j=0;j<strlen(bds[i]);j++)
                        k=k*10+(bds[i][j]-'0');
                }
            }
            push(S,k);
        }
        else
        {
            x=pop(S);
            if(S.top==0)
            {
                printf("Expression Error:%d",x);
                break;
            }
            else
            {
                y=pop(S);
                switch(bds[i][0])
                {
                    case '+':push(S,x+y);
                    case '-':push(S,x-y);
                    case '*':push(S,x*y);
                    case '/':
                        {
                            if(y==0)
                                printf("Error:%d/0",x);
                            else push(S,x/y);
                        }
                }
            }
        }
    }
    if(S.top==1)
        printf("%d",S.data[0]);
    else printf("Expression Error:%d",S.data[S.top-1]);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 浪客 2022-09-30 03:09
    关注

    scanf("%s", &a); scanf忽略空白字符,输入1 2 +,a的值只有1,后面的舍弃了。
    问题太多,根据你的改写了下。

    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #define MAXSIZE 100
    
    typedef struct
    {
        int data[MAXSIZE];
        int top;
    } stack;
    
    void push(stack *S, int z) //修改参数的值需要传指针
    {
        if (S->top >= MAXSIZE)
            return;
        S->data[S->top] = z;
        S->top++;
        // return;
    }
    int pop(stack *S)
    {
        if (S->top <= 0)
            return 0;
        int x = S->data[--S->top];
        S->data[S->top] = 0;
        return x;
    }
    int main()
    {
        char bds[20][MAXSIZE] = {0};
        int n = 0;
    
        for (int i = 0;; i++, n++)
        {
            // scanf("%s", &a);//scanf不接收空白字符,一次读取不了一行
            fgets(bds[n], MAXSIZE, stdin);
            if (bds[n][0] == '#') //
                break;
        }
    
        for (int i = 0; i < n; i++)
        {
            stack S = {0};
            int len = strlen(bds[i]) - 1; // fgets会接受末尾的'\n'
            int k = 0, flag = 1, err = 0;
            int x, y;
            for (int j = 0; j < len; j++)
            {
                if (isspace(bds[i][j])) //跳过空白字符
                    continue;
    
                if (isdigit(bds[i][j]) || (bds[i][j] == '-' && isdigit(bds[i][j + 1])))
                {
                    if (bds[i][j] == '-')
                    {
                        flag = -1;
                        continue;
                    }
    
                    for (; j < len; j++)
                    {
                        if (isdigit(bds[i][j]))
                            k = k * 10 + (bds[i][j] - '0');
                        else
                        {
                            k *= flag;
                            flag = 1;
                            j--;
                            break;
                        }
                    }
                    push(&S, k);
                    k = 0;
                }
                else
                {
                    y = pop(&S);
                    if (S.top == -1)
                    {
                        printf("Expression Error:%d\n", y); //
                        err = 1;
                        break;
                    }
                    x = pop(&S);
                    switch (bds[i][j])
                    {
                    case '+':
                        push(&S, x + y);
                        break; //
                    case '-':
                        push(&S, x - y);
                        break; //
                    case '*':
                        push(&S, x * y);
                        break; //
                    case '/':
                    {
                        if (y == 0)
                        {
                            printf("Error:%d\n", x); //
                            err = 1;
                        }
                        else
                            push(&S, x / y);
                        break; //
                    }
                    }
                }
            }
            if (!err) //出错则不显示下面信息
            {
                if (S.top == 1)
                    printf("%d\n", S.data[0]);
                else
                    printf("Expression ErrorB:%d\n", S.data[S.top - 1]); //
            }
            err = 0;
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月30日
  • 已采纳回答 9月30日
  • 创建了问题 9月29日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助