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

算法的基本流程

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

对于数字:直接输出

对于符号:

左括号:进栈

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

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

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

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

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

下面的代码是用之前的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;
}//后续操作,将后缀表达式进行计算也是借助于栈的利用,不过就比较简单了相对来讲。

原文地址:https://www.cnblogs.com/randyniu/p/9176012.html

时间: 2024-10-09 23:05:45

中缀表达式转换成为后缀表达式的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

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

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de

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

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是

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

中缀表达式(标准形式):A+(B-C/D+E)*F 后缀表达式(便于计算机计算):ABCD/-E+F*+ 本文使用栈来实现中缀表达式到后缀表达式的转换. 操作数:A B C D E F 操作符:+ - / * ( ) 操作符优先级:( )  >  / *  >  + - 逐个字符读取中缀表达式,结果不断输出,利用栈对操作符进行缓存: 1. 遇到操作数直接输出 2. 遇到操作符,如果此操作符优先级大于栈顶操作符,则将此操作符压栈,否则输出栈顶操作符:如遇到),则把栈内操作符依次弹出,直到(,()

表达式树—中缀表达式转换成后缀表达式(一)

算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将栈中的元素依次出栈,输出.例如a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出:后缀表达式:a堆栈:空 遇到+:堆栈:空,所以+

3-6 中缀表达式转换成后缀表达式

1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(214): warning C4602: #pragma pop_macro:"new"该标识符前面没有 #pragma push_macro1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(215): warning C4193: #pragma warning(p

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

八、通过中缀计算表达式转换成后缀计算表达式

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在通过栈对运算符号的入栈.出栈操作实现将中缀表达式转化成后缀表达式 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* n