栈的实例—中缀表达式转化后缀表达式

 

思路:

考虑括号和优先级

/*
1.如果是数字,直接打印
2.如果是右括号,弹出并打印,直到出现左括号只弹出
3.如果是+,-,栈空直接入栈,否则,依次弹出打印直到遇到左括号
4.如果是*,/,(,直接入栈。
*/
 
 
/*
1.如果是数字,直接打印
2.如果是右括号,弹出并打印,直到出现左括号只弹出
3.如果是+,-,栈空直接入栈,否则,依次弹出打印直到遇到左括号
4.如果是*,/,(,直接入栈。
*/
//中缀表达式转换成后缀表达式
#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指针指向的内存块  重新分配内存
        s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT) * sizeof(ElemType));
        //若为空,则分配失败
        if(!s->base)
        {
            exit(0);
        }
    }
    *(s->top) = e;      //把数据e压入栈顶指针指向的地址
    s->top++;
}

//出栈操作
void Pop(sqStack *s,ElemType *e)
{
    if(s->top==s->base)
    {
        return;
    }
    *e = *--(s->top);   //先减再把值赋给e
}

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

int main()
{
    char c;
    char e;
    sqStack  s;
    int i = 0;

    InitStack(&s);

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

    while(c!='#')
    {
        //i用于调试,因为结果不对,一直是只出现第一组数,就啥也没了
        //原因:竟然是scanf("%c", &c);里写成了单引号
        //printf("%d",i++);
        while(c>='0' && c<='9')
        {
            printf("%c", c);
            scanf("%c", &c);
            if(c<'0' || c>'9')
            {
                printf(" ");
            }
        }
        // while(isdigit(c) || c=='.')
        // {
        //     printf("%c", c);
        //     scanf("%c", &c);
        //     if(! isdigit(c))
        //     {
        //         printf(' ');
        //     }
        // }
        if(')'==c)
        {
            Pop(&s, &e);
            while('('!=e)
            {
                printf("%c ", e);
                Pop(&s, &e);
            }
            
        }
        else if('+'==c || '-'==c)
        {
            if(!StackLen(s))
            {
                printf("vds");
                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;
}
View Code

遇到的问题:

//i用于调试,因为结果不对,一直是只出现第一组数,就啥也没了
输入12+3#  结果:12       没了!!!!
 
//原因:竟然是scanf("%c", &c);里写成了单引号

 

posted @ 2020-08-27 20:41  wind_y  阅读(199)  评论(0编辑  收藏  举报