数据结构之中缀变后缀

中缀表达式变后缀表达式

1. Target:用C语言实现字符的中缀式转换

〖Example〗 a*( b+c )/d = abc+*d/

2. Notice:

  • The order of operands is the same in infix and postfix.(在中缀和后缀表达式中操作数的顺序是一致的)
  • Operators with higher precedence appear before those with lower precedence.(更高优先级的操作符比更低优先级的操作符更先出现)

3. Introduction:

(1)定义优先级

枚举类型enum,可以一次性定义多个宏。

/*优先级,从小到大分别为 '=' ,在栈里的'(','+''-','*','/',在栈外的'(' */
enum priority{EQUAL=0,LKUO_IN=2,ADD=3,SUB=3,MUL=5,DEV=5,LKUO_OUT=6};

/*优先级数组*/
int prior[MAXN];
int prior_in[MAXN]; /*栈里栈外,the priority of '(' is different.*/
prior_in['='] = prior['='] = EQUAL;
prior_in['-'] = prior['-'] = SUB;
prior_in['+'] = prior['+'] = ADD;
prior_in['*'] = prior['*'] = MUL;
prior_in['/'] = prior['/'] = DEV;
prior['('] = LKUO_OUT;
prior_in['('] = LKUO_IN;

4. 完整代码

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

#define MAXN 200
enum priority{EQUAL=0,LKUO_IN=2,ADD=3,SUB=3,MUL=5,DEV=5,LKUO_OUT};/*优先级,从小到大*/
/*前缀变后缀*/

int main(){
    char str[MAXN];
    char stack[MAXN];
    int i = 0;

    /*优先级数组*/
    int prior[MAXN];
    int prior_in[MAXN]; /*栈里栈外,the priority of '(' is different.*/
    prior_in['='] = prior['='] = EQUAL;
    prior_in['-'] = prior['-'] = SUB;
    prior_in['+'] = prior['+'] = ADD;
    prior_in['*'] = prior['*'] = MUL;
    prior_in['/'] = prior['/'] = DEV;
    prior['('] = LKUO_OUT;
    prior_in['('] = LKUO_IN;

    int cursor = -1;    /*means empty*/

    stack[++cursor] = '=';  /*预存一个'='*/

    scanf("%s",&str);
    while(str[i] != '\0'){
        if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '('){
            if(prior[str[i]] > prior_in[stack[cursor]]){ 
                /*如果优先级比栈顶元素高,则入栈*/
                stack[++cursor] = str[i];
            }else{
                /*如果优先级比栈顶元素低,则出栈直到优先级比栈顶元素高为止*/
                while(prior_in[stack[cursor]] >= prior[str[i]]){
                    if(stack[cursor] != '(' && stack[cursor] != ')')
                        printf("%c",stack[cursor--]);
                    else
                        cursor--;
                }
                stack[++cursor] = str[i];
            }
            i++;
        }else if('a'<= str[i] && str[i]<='z'){
            /*不是操作符,直接输出*/
            printf("%c",str[i]);
            i++;
        }else if(str[i] == ')'){
            /*如果是  ")" ,则将符号栈栈内符号依次弹出,push,直到遇见  "("  为止,*/
            while(stack[cursor] != '('){
                if(stack[cursor] != '(' && stack[cursor] != ')')
                    printf("%c",stack[cursor--]);
                else
                    cursor--;
            }
            /*同时除去'(',')'*/
            cursor--;
            i++;
        }else{
            break;
        }
    }
    /*最后的操作数读入后,栈非空,把栈中元素清空*/
    while(stack[cursor] != '='){
        if(stack[cursor] != '(' && stack[cursor] != ')')
            printf("%c",stack[cursor--]);
        else
            cursor--;
    }

    return 0;
}

5. 实例展示

三个例子,第一个为1个括号;第二个为两个单独的括号,第三个为嵌套括号。
三个示例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值