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

Posted randyniu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转换成为后缀表达式相关的知识,希望对你有一定的参考价值。

算法的基本流程

遍历中缀表达式中的数字和符号

对于数字:直接输出

对于符号:

左括号:进栈 

运算符号:与栈顶符号进行优先级比较

    若栈顶符号优先级低:此符合进栈  (默认栈顶若是左括号,左括号优先级最低) 

    若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈

右括号:将栈顶符号弹出并输出,直到匹配左括号

遍历结束:将栈中的所有符号弹出并输出。

下面的代码是用之前的linkStack来实现的,没有借助于C++标准库,当然用C++标准库实现起来hi更优雅一点,笔记自己用C写的代码,还是有点难看的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "linkStack.h"

bool isoperator(char op)
{
    switch (op)
    {
    case +:
    case -:
    case *:
    case /:
    case (:
        return 1;
    default:
        return 0;
    }
}

int priority(char op)
{
    switch (op)
    {
    case (:
        return 0;
    case +:
    case -:
        return 1;
    case *:
    case /:
        return 2;
    default:
        return -1;
    }
}

void handle(char *s)
{
    linkStack* stack = linkStack_Create();

    int len = strlen(s);

    for(int i=0; i<len; ++i)
    {
        if(isoperator(s[i]))
        {
//如果栈为空或者是操作符为‘(‘就直接进栈了
if(linkStack_Size(stack)==0 || s[i] == () { linkStack_Push(stack,&s[i]); continue; }
//优先级的判断
if(priority(s[i]) >= priority(*((char*)linkStack_Top(stack)))) { linkStack_Push(stack,&s[i]); }else { printf("%c", *((char*)linkStack_Pop(stack))); linkStack_Push(stack,&s[i]); } }//准备出栈了 else if(s[i] == )) { while(true) { char tmp = *((char*)linkStack_Pop(stack)); if(tmp == () break; printf("%c", tmp); } } else { printf("%c",s[i]); } }//将栈中的所有元素全部投弹出去 while(linkStack_Size(stack) > 0) { printf("%c", *((char*)linkStack_Pop(stack))); } } int main() { char mid_expre[] = "8+(3-1)*5"; handle(mid_expre); return 0; }
//后续操作,将后缀表达式进行计算也是借助于栈的利用,不过就比较简单了相对来讲。




以上是关于中缀表达式转换成为后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何在程序中将中缀表达式转换为后缀表达式

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

中缀表达式如何转换为前后缀表达式?

中缀表达式检测并转换后缀表达式,计算后缀表达式的结果

中缀表达式转换前\后缀表达式的总结

中缀表达式转换为后缀表达式(1042)