鱼C论坛

 找回密码
 立即注册
查看: 3147|回复: 8

小甲鱼的中缀表达式转化为后缀表达式

[复制链接]
发表于 2021-11-26 19:25:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼的中缀表达式转化为后缀表达式中个人发现有两个问题,如果还有存在其他问题也可以指出,谢谢

1.当输入 (1-2)*(4+5)# 时不知道为什么#读取不了,只打印 1 2 - 4 + 5  程序也没有结束,我再输一个 # 才会结束然后打印出最后那个 *。

2.当输入  2/3*6   时会打印 2 3 6 * / ,这样如果要结合小甲鱼的逆波兰计算器,就会出现 2/(3*6),导致结果错误。

最后我想请问一下怎么结合中缀表达式转化为后缀表达式和小甲鱼的逆波兰计算器,希望大家可以给我一点建议和思路,非常感谢!
#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stacksize;
}sqStack;

void initStack(sqStack *s)
{
    s->base=(ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(!s->base)
    {
        exit(0);
    }
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}

void Push(sqStack *s,ElemType e)
{
    if(s->top-s->base >= s->stacksize)
    {
        s->base=(ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
        if(!s->base)
        {
            exit(0);
        }
        s->top=s->base+s->stacksize;
        s->stacksize=s->stacksize+STACKINCREMENT;
    }
    *(s->top)=e;
    s->top++;
}

void Pop(sqStack *s,ElemType *e)
{
    if(s->base==s->top)
    {
        return ;
    }
    *e=*(--(s->top));
}

int StackLen(sqStack s)
{
    return (s.top-s.base);
}

int main()
{
    sqStack s;
    char c,e;

    initStack(&s);

    printf("输入中缀表达式,以#作为结束标志: ");
    scanf("%c",&c);

    while(c!='#')
    {
        while( c>='0' && c<='9' )
        {
            printf("%c",c);
            scanf("%c",&c);
            if( c<'0' || c>'9' )
            {
                printf(" ");
            }
        }

        if( c==')' )
        {
            Pop(&s,&e);
            while( e!='(' )
            {
                printf("%c ",e);
                Pop(&s,&e);
            }
        }

        else if( c=='+' || c=='-' )
        {
            if(!StackLen(s))
            {
                Push(&s,c);
            }
            else
            {
                do
                {
                    Pop(&s,&e);
                    if( e=='(' )
                    {
                        Push(&s,e);
                    }
                    else
                    {
                        printf("%c ",e);
                    }
                }while( StackLen(s) && e!='(' );  
                Push(&s,c);
            }
        }

        else if( c=='*' || c=='/' || c=='(' )
        {
            Push(&s,c);
        }

        else if( c =='#' )
        {
            break;
        }

        else
        {
            printf("\n出错了:输入格式错误\n");
            return -1;
        }

        scanf("%c ",&c);
    }

    while( StackLen(s) )
    {
        Pop(&s,&e);
        printf("%c ",e);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-29 12:34:58 | 显示全部楼层
有木有人可以帮我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-5 14:24:07 | 显示全部楼层
我也发现了但是我改不过来,我把这个问题改对了其他问题又错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-7 16:40:53 | 显示全部楼层
没飞色武 发表于 2021-12-5 14:24
我也发现了但是我改不过来,我把这个问题改对了其他问题又错了

太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-16 18:27:12 | 显示全部楼层
楼主解决了吗?我敲这个代码也有这个问题,还有有时不输出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-22 15:52:07 | 显示全部楼层
leacky2006 发表于 2022-3-16 18:27
楼主解决了吗?我敲这个代码也有这个问题,还有有时不输出结果

没有呢,想不明白哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 23:19:59 | 显示全部楼层
本帖最后由 宇宙大队长 于 2022-4-1 23:24 编辑
青衫烟雨客 发表于 2021-11-29 12:34
有木有人可以帮我看看


我也是新手刚看完这集,对于第一个问题你再仔细检查一遍代码,小甲鱼在视频后面更改了一些代码。第二个问题我也刚发现,2/3*6正确的逆波兰表达式应该是2 3 / 6 *但是按照小甲鱼的代码却输出 2 3 6 * / 我想是不是在*或/压入栈之前应该判断栈内(top)的符号,如果和它同级别就先将栈内的符号*或/输出再压入新的符号*或/,这个思路和+ -类似。你将源代码改成
else if('*'==c||'/'==c||'('==c)
        {
                Pop(&s,&e);
                if('*'==e||'/'==e)
                {
                        printf("%c ",e);
                }
                else
                {
                        Push(&s,e);//前一个符号级别低,再压回去
                }
                Push(&s,c);
        }
可能还有BUG,我现在只想到这么多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 12:52:20 | 显示全部楼层
本帖最后由 宇宙大队长 于 2022-4-2 12:53 编辑
宇宙大队长 发表于 2022-4-1 23:19
我也是新手刚看完这集,对于第一个问题你再仔细检查一遍代码,小甲鱼在视频后面更改了一些代码。第二个 ...


今天我试着合并了一下代码,发现这个模块还是有问题,在遇到1+2*(8-9)时,在输入(后*直接弹栈,计算顺序有问题 ,所以我又加了一个判断,
else if('*'==c||'/'==c||'('==c)
        {
                if('*'==c||'/'==c)
                {
                        PopC(&ch,&e);
                        if('*'==e||'/'==e)
                        {
                                cal(&num,e);//我把计算部分写成了子函数,传入数栈与此事的符号
                        }
                        else
                        {
                                PushC(&ch,e);
                        }
                }
                PushC(&ch,c);
        }
现在完成的计算器暂时没找出BUG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 16:27:41 | 显示全部楼层
leacky2006 发表于 2022-3-16 18:27
楼主解决了吗?我敲这个代码也有这个问题,还有有时不输出结果

看我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表