青衫烟雨客 发表于 2021-11-29 18:05:19

中缀表达式转换为后缀表达式

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

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;
}
页: [1]
查看完整版本: 中缀表达式转换为后缀表达式