数据结构与算法—后缀表达式+中缀转后缀

● 在《数据结构与算法分析(C语言描述)》关于栈的应用里有后缀表达式中缀到后缀的转换。看完之后觉得似乎有实现的可能,磨了很久终于实现了出来(小菜鸡一枚)。

1、后缀表达式

思路:1、输入后缀表达式。2、设置一个栈。3、将未遇到运算符的数字全部存入栈内。4、遇到运算符将栈内最上面的两个数弹出,通过该运算符计算后再存入栈内。5、依次循环。

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100
typedef int SElemType;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

int InitStack(SqStack &S)
{
    S.base = new SElemType[MAXSIZE];
    if (!S.base) return 0;
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return 1;
}

int Push(SqStack &S, SElemType e)
{
    if (S.top - S.base == S.stacksize) return 0;
    *S.top++ = e;
    return 1;
}

int Pop(SqStack &S, SElemType &e)
{
    if (S.top == S.base) return 0;
    e = *(--S.top);
    return 1;
}

int main()
{
    char a[MAXSIZE];
    int val;
    scanf("%s", a);
    SqStack S;
    InitStack(S);
    for (int i = 0; a[i] != '\0'; i++)
    {
        if ('9' >= a[i] && a[i] >= '0')
        {
            Push(S, a[i] - '0');
        }
        else {
            int val1 , val2 ;
            Pop(S, val2);
            Pop(S, val1);
            if (a[i] == '+')
            {
                val = val1 + val2;
                Push(S, val);
            }
            if (a[i] == '*')
            {
                val = val1 * val2;
                Push(S, val);
            }
        }
    }
    Pop(S, val);
    printf("%d", val);
    return 0;
}

 

2、中缀到后缀的转换

思路:1、当读到的是一个数时,立即把它放到输出中。操作符先存入栈内。2、如果见到一个) ,那么就将栈元素弹出,将弹出的元素写出直到遇到( (只弹出,不输出)。3、当遇到+*(时,将元素压入栈内,直到遇到更低级的元素。

用图片理解一下:

如果你手中有《数据结构与算法分析》这本书,不放打开第75-76页,结合里面的文字去理解这个图。(其实此图和书上的例图是一样的哦~看懂了书上的意思就可以跳过我的思路内容啦。)

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100
typedef char SElemType;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

int InitStack(SqStack &S)
{
    S.base = new SElemType[MAXSIZE];
    if (!S.base) return 0;
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return 1;
}

int Push(SqStack &S, SElemType e)
{
    if (S.top - S.base == S.stacksize) return 0;
    *S.top++ = e;
    return 1;
}

int Pop(SqStack &S, SElemType &e)
{
    if (S.top == S.base) return 0;
    e = *(--S.top);
    return 1;
}

SElemType GetTop(SqStack S)
{
    if(S.top!= S.base)
        return *(S.top -1);
    return '\0';
}

int main(void)
{
        char a[MAXSIZE];
    int val;
    scanf("%s", a);
    SqStack S;
    InitStack(S);
    for (int i = 0; a[i] != '\0'; i++)
    {
            if('z' >= a[i] && a[i] >= 'a')
                {
                        printf("%c", a[i]);
                }
                else{
                        if(a[i]=='+' || a[i]=='-')
                        {
                                while(GetTop(S)!= NULL && GetTop(S)!= '(')
                                {
                                        if(GetTop(S)=='*' || GetTop(S)=='/' || GetTop(S)=='+' || GetTop(S)=='-')
                                        {
                                        SElemType val1;
                                        Pop(S, val1);
                                        printf("%c", val1);        
                                        }
                                }
                                
                                        Push(S,a[i]);
                        }
                        if(a[i]=='*' || a[i]=='/')
                        {
                                if(GetTop(S)=='+' || GetTop(S)=='-')
                                {
                                        Push(S,a[i]);
                                }
                                else if(GetTop(S)=='*' || GetTop(S)=='/'){
                                        SElemType val2;
                                        Pop(S, val2);
                                        printf("%c", val2);
                                        Push(S,a[i]);
                                }
                                else{
                                        Push(S,a[i]);
                                }
                        }
                        if(a[i]=='(')
                        {
                                Push(S,a[i]);
                        }
                        if(a[i]==')')
                        {
                                while(GetTop(S)!='(')
                                {
                                        SElemType temp;
                                        Pop(S, temp);
                                        printf("%c", temp);
                                }
                                SElemType temp;
                                Pop(S, temp);
                        } 
                }         
        }
        while(GetTop(S)!=NULL)
        {
                SElemType temp;
                Pop(S, temp);
                printf("%c", temp);
        }
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值