青衫烟雨客 发表于 2021-11-26 19:25:48

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

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

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;
}

青衫烟雨客 发表于 2021-11-29 12:34:58

有木有人可以帮我看看{:10_266:}{:10_266:}{:10_266:}{:10_266:}

没飞色武 发表于 2021-12-5 14:24:07

我也发现了但是我改不过来,我把这个问题改对了其他问题又错了

青衫烟雨客 发表于 2021-12-7 16:40:53

没飞色武 发表于 2021-12-5 14:24
我也发现了但是我改不过来,我把这个问题改对了其他问题又错了

太难了{:10_266:}{:10_266:}{:10_266:}

leacky2006 发表于 2022-3-16 18:27:12

楼主解决了吗?我敲这个代码也有这个问题,还有有时不输出结果

青衫烟雨客 发表于 2022-3-22 15:52:07

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

没有呢,想不明白哈哈哈{:10_266:}{:10_266:}

宇宙大队长 发表于 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,我现在只想到这么多{:10_243:}

宇宙大队长 发表于 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{:10_257:}

宇宙大队长 发表于 2022-4-2 16:27:41

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

看我
页: [1]
查看完整版本: 小甲鱼的中缀表达式转化为后缀表达式