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

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER   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->top == s->base)
        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");
            return -1;
        }
        scanf("%c", &c);
    }
 
    while( StackLen(s))
    {
        Pop( &s, &e);
        printf("%c ", e);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值