鱼C论坛

 找回密码
 立即注册
查看: 905|回复: 0

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

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

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

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

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
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-7 02:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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