精华内容
下载资源
问答
  • 直接上例子: 若a=1,b=2,c=3,d=4,则后缀式db/cc*a-b*+ 步骤:

    直接上例子:

    若a=1,b=2,c=3,d=4,则后缀式db/cc*a-b*+

    步骤:

    展开全文
  • 前面介绍了中缀表达式转化为后缀表达式,那么后缀表达式怎么求值的呢? 一、算法原理 与中缀转化为后缀的问题不同,在对后缀表达式从左到右扫描的过程中,由于操作符在操作数的后面,所以要暂存操作数,碰到操作符...

    目录

    一、算法原理

    二、实例

    三、流程

    四、代码


    前面介绍了中缀表达式转化为后缀表达式,那么后缀表达式怎么求值的呢?

    一、算法原理

    与中缀转化为后缀的问题不同,在对后缀表达式从左到右扫描的过程中,由于操作符在操作数的后面,所以要暂存操作数碰到操作符的时候,再把暂存的两个操作数取出来,进行实际的计算

    仍然是栈的特性:操作符之作用于与它最近的两个操作数

    如“456*+”:

    • 先扫描到4和5两个操作数,但是此时不知道这两个操作数要进行什么样的操作,所以暂存起来。
    • 继续扫描,碰到了操作数6,还是不知道怎么计算,仍然暂存。
    • 直到“*”,现在知道是栈顶的两个操作数5和6做乘法。计算结果是30。
    • 注意:先弹出的是右操作数,后弹出的是左操作数,这一点对减法和除法比较重要。
    • 为了继续后续的操作,我们把中间结果30压入栈顶,继续扫描。
    • 当所有的操作符都处理完毕,栈中只留下一个操作数,就是表达式的值。

    二、实例

     

     

    三、流程

    1. 创建空栈operandstack用来存放操作数,把后缀表达式解析为单词
    2. 从左到右扫描列表:
    3. 如果单词是操作数,将单词转化为int,压入栈顶
    4. 如果单词是操作符,就开始求值,从栈顶弹出两个操作数,先弹出的是右操作数,后弹出的是左操作数,计算完成后将计算结果压入栈顶。
    5. 扫描结束后,表达式的值就在栈顶。
    6. 弹出栈顶的值,返回

    四、代码

    class Stack():
        """定义一个栈"""
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return self.items() == []
    
        def pop(self):
            return self.items.pop()
    
        def push(self, item):
            return self.items.append(item)
    
        def peek(self):
            return self.items[len(self.items)-1]
    
        def size(self):
            return len(self.items)
    
    
    def postfixEval(postfixExpr):
        # 主函数
        operandstack = Stack()
        tokenlist = postfixExpr.split()
    
        for token in tokenlist:
            if token in '0123456789':
                token = int(token)
                operandstack.push(token)
            else:
                op2 = operandstack.pop()
                op1 = operandstack.pop()
                result = docal(op1, op2, token)
                operandstack.push(result)
        return operandstack.pop()
    
    def docal(op1, op2, token):
        if token == '+':
            return op1 + op2
        elif token == '-':
            return op1 - op2
        elif token == '*':
            return op1 * op2
        else:
            return op1 / op2
    print(postfixEval('456*+'))

     

    展开全文
  • 9 3 1 - 3 * + 10 2 / + 像这样的后缀表达式怎么值呢?
  • 中缀转后缀表达式求值 题目链接: HNUCM-OJ 1232 算法3-4 表达式值 解题思路: 这一个题,关键是怎么表现两个运算符的优先级,在网上看到一个大佬的总结,用一个二维数组来表现,运算符之间的优先级,其中θ1为...

    HNUCM-OJ 1232 算法3-4 表达式求值

    中缀转后缀表达式求值

    在这里插入图片描述
    题目链接:
    HNUCM-OJ 1232 算法3-4 表达式求值

    解题思路:
    在这里插入图片描述
    这一个题,关键是怎么表现两个运算符的优先级,在网上看到一个大佬的总结,用一个二维数组来表现,运算符之间的优先级,其中θ1为存放运算符的栈(我自己定义的为s2)的栈顶元素,θ2为从表达式中读取的操作符

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <stack>
    
    using namespace std;
    
    const int cmax=10e5+5;
    char s[cmax];
    stack<double> s1;
    stack<char> s2;
    const char priority[7][7]=
    {
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=','0'},
        {'>','>','>','>','0','>','>'},
        {'<','<','<','<','<','0','='},
    };
    int getIndex(char c)
    {
        int index;
        switch(c)
        {
        case'+':
            index=0;
            break;
        case'-':
            index=1;
            break;
        case'*':
            index=2;
            break;
        case'/':
            index=3;
            break;
        case'(':
            index=4;
            break;
        case')':
            index=5;
            break;
        default:
            index=6;
            break;
        }
        return index;
    }
    char getPriority(char a,char b)
    {
        int index1,index2;
        index1=getIndex(a);
        index2=getIndex(b);
        return priority[index1][index2];
    }
    double calculate(double num1,char c,double num2)
    {
        double sum;
        switch(c)
        {
        case'+':
            sum=num2+num1;
            break;
        case'-':
            sum=num2-num1;
            break;
        case'*':
            sum=num2*num1;
            break;
        case'/':
            sum=num2/num1;
            break;
        }
        return sum;
    }
    double getAnswer(char s[])
    {
        s2.push('#');
        int counter=0;
        int len=strlen(s);
        int i=0;
        while(i<len)
        {
            if(s[i]-'0'>=0&&s[i]-'0'<=9)
            {
                if(counter==1)
                {
                    double num1=s1.top();
                    s1.pop();
                    num1=num1*10+(s[i]-'0');
                    s1.push(num1);
                    i++;
                }
                else
                {
                    s1.push(s[i]-'0');
                    i++;
                    counter++;
                }
            }
            else
            {
                counter=0;
                char c=getPriority(s2.top(),s[i]);
                switch(c)
                {
                case'<':
                    s2.push(s[i]);
                    i++;
                    break;
                case'>':
                {
                    char c1=s2.top();
                    s2.pop();
                    double num2=s1.top();
                    s1.pop();
                    double num3=s1.top();
                    s1.pop();
                    double num4=calculate(num2,c1,num3);
                    s1.push(num4);
                    break;
                }
                case'=':
                    s2.pop();
                    i++;
                    break;
                }
            }
        }
        return s1.top();
    }
    int main()
    {
        while(~scanf("%s",s))
        {
            while(!s1.empty())
                s1.pop();
            while(!s2.empty())
                s2.pop();
            double num=getAnswer(s);
            cout<<num<<endl;
        }
        return 0;
    }
    
    
    展开全文
  • 中缀转后缀 和 后缀表达式求

    千次阅读 2017-04-03 08:43:20
    下面内容转载自:http://www.iteye.com/topic/1130373如何书写逆波兰表达式:先看一下怎么书写前缀表达式: 1. 如2+(3+4)*5这种我们最常见的式子就是中缀式。 2. 而把中缀式按运算顺序加上括号就是:(2+((3+4)

    逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法)被称为后缀表示法,(当然波兰表示法 就是 前缀表示法)。
    下面内容转载自:http://www.iteye.com/topic/1130373

    如何书写逆波兰表达式:

    先看一下怎么书写前缀表达式:
    1. 如2+(3+4)*5这种我们最常见的式子就是中缀式。
    2. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))
    3. 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )
    4. 把括号去掉就是:+ 2 * + 3 4 5
    5. 最后这个式子就是该表达式的前缀表示。
    所以后缀表达式的书写应该和前缀表达式类似。但是这只是人为手工书写,如何用计算机写呢?

    逆波兰表达式计算原理:

    逆波兰表达式进行数据计算的时候一般分为两步:
    1.将中缀表达式转换为后缀表达式
    2.对转换完成后的后缀表达式进行计算

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

    第一步:将其转换为后缀表达式
    1.首先我们要建立一个集合 sList 来存放例子中的数据和操作符号,一个栈opStack来存放中间的操作符号,一个集合dList 来存放最后的转换结果。

    2.从sList中取出一个元素A然后进行以下判断:

           1.如果A是数字,则直接存如dList 
           2.如果A是运算符,则和opStack栈顶的元素进行运算优先级比较 
              1.如果A的优先级高于栈顶运算符优先级,则将A入栈opStack 
              2.如果A的优先级低于或等于栈顶运算符的优先级,那么将栈顶的元素出栈存入dList,
                   重复此步骤直到栈顶的运算符优先级低于当前运算符,然后A入栈。 
              3.如果A是左括号“(”直接入栈,如果是右括号“)”,则将opStack中的运算符弹出
                     存入dList,直到弹出左括号,左右括号均不存入dList,左括号永远不会弹出,
                     直到遇到右括号。 
              4.不断重复以上步骤直到表达式解析完成。 
    

    例子:我们以a+b-c*(d+e) 来进行分析
    dList opStack

    {} {}
    {a} {} //a 加入dList
    {a} {+} //+ 入栈
    {a,b} {+} //b 加入dList
    {a,b,+} {-} //+号出栈,-号入栈
    {a,b,+,c} {-} //c 加入dList
    {a,b,+,c} {-,} //因为 的优先级高于- 则将* 直接入栈
    {a,b,+,c} {-,*,(} //左括号直接入栈
    {a,b,+,c,d} {-,*,(} //d 加入dList
    {a,b,+,c,d} {-,*,(,+} //+ 直接入栈
    {a,b,+,c,d,e} {-,*,(,+} //e 直接加入dList
    {a,b,+,c,d,e,+} {-,*} //将左括号之上的符号出栈加入dList
    {a,b,+,c,d,e,+,*,-} {} //将栈中的剩余元素弹出

    将dList 中的元素输出,则得到后缀表达式:ab+cde+*-

    后缀表达式求值算法

    首先建立一个结果栈rStack,然后将dList中的元素依次取出,进行入栈操作,如果碰到操作符就从栈中取出两个元素进行运算,结果入栈,依次重复。
    注意: 每次从dList取出元素时,是从栈底取出的,并不是从栈顶取出的。因为这里dList用的是容器,所以才会没什么问题。

    下面接着看上面的例子
    dList {a,b,+,c,d,e,+,*,-}

    rStack
    { }
    {a} //a入栈
    {a,b} //b入栈
    {a+b} //遇到+号,取出两个操作数进行运算,运算结果入栈
    {a+b,c}
    {a+b,c,d}
    {a+b,c,d,e}
    {a+b,c,d+e}

    {a+b,c*(d+e)}
    {a+b-c*(d+e)}

    计算结果:a+b-c*(d+e)

    参考博客:
    http://www.iteye.com/topic/1130373
    http://blog.csdn.net/shiwazone/article/details/47067921

    展开全文
  • 一、先将中缀表达式转为后缀表达式 规则: 遇到数字:直接输出 遇到左括号:直接入栈 ...举例:有中缀表达式:A+B*(C-D)-E/F,怎么后缀表达式呢 步骤1:遇到A,输出A 栈:空 步骤2:遇到+,入栈...
  • 中缀、前缀和后缀表达式求值问题

    千次阅读 2014-08-06 09:02:31
     表达式一般来说有三种:前缀表达式、中缀表达式、后缀表达式,其中后缀表达式又叫做逆波兰表达式。中缀表达式是最符合人们思维方式的一种表达式,顾名思义,就是操作符在操作数的中间。而前缀表达
  • 中缀表达式转换为后缀表达式

    千次阅读 2018-08-14 09:22:14
    参考:中缀表达式转换为后缀表达式 参考:中缀表达式值问题 一丶中缀表达式值问题 中缀表达式的值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是...
  • 前缀 中缀 后缀 表达式求值问题

    千次阅读 2015-08-29 13:03:53
     中缀表达式值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么表达式进行值的,今天我们来一起了解一下其中具体的原理和过程。  表达式
  • 后缀表达式转中缀表达式(非常简单易懂)

    万次阅读 多人点赞 2019-06-25 20:43:59
    举个例子~对于后缀表达式ABCD−∗+EF/−ABCD-*+EF/-ABCD−∗+EF/−,它的中缀表达式该怎么求呢?其实很简单,下面将会一步一步讲解: 1、把后缀表达式逐个元素的压入到栈中,当压入的都是字符,则不采取任何操作,当...
  • 用栈对表达式值就要想到前缀表达式和后缀表达式了,后缀表达式方便...那么问题来了,怎么将常规表达式转化成后缀表达式? 以a*b+(c-d/e)*f为例 方法一: 1,遇到操作数直接输出到后缀表达式 2,遇到操作符 ...
  • 中缀与后缀表达式

    2019-11-21 16:08:37
    这里主要说一说中缀怎么后缀表达式,以及怎样根据后缀表达式求值。 中缀转后缀 方法有二。 其一:规则法 1、中缀表达式从左到右依次扫描,遇到操作数,直接输出; 2、遇到操作符需要判断(另:正负号应算入...
  • 逆波兰(后缀表达式求值C++实现

    千次阅读 2018-04-04 10:01:08
    之前的一篇文章里已经讲到里怎么将中缀表达式转化为后缀表达式:https://blog.csdn.net/weixin_39138071/article/details/79809533现在我们用C++实现如何根据后缀表达式求值1、遍历后缀表达式;2、如果扫描的是数字...
  • 中缀表达式转后缀表达式3.参考文献 栈—四则运算表达式值 9+(3-1)×3+10÷2=? 计算机是怎么算出来等于20的呢? 本文讲解的内容是计算机如何使用栈来表达数学中的四则运算和值。文中有两个主要的概念,分别是...
  • 计算器(后缀表达式)

    2013-03-18 14:29:03
    主要就是了解一下怎么把中缀表达式转化成后缀表达式,然后再利用后缀表达式求值,我后续会完善这个程序,做个真正意义上的计算器。。o(∩_∩)o 转化步骤我搜索了一下,大致如下: 将中缀表达式转换为等价的后缀...
  • 前缀表达式求值: 从右至左扫描,遇到表达式---->压入堆栈、遇到操作符---->弹出栈顶的两个元素,用这个操作符进行运算并将运算结果入栈。重复以上操作将整个表达式扫描完毕,最后栈中的元素就是结果。 中缀...
  • 在<大话数据结构>有个计算题应用,觉得挺有意思,没想到做出来非常繁琐 不怎么建议使用到项目中,代码局限性太多了(也不知道什么项目会用到) 总之,自己敲着玩还行.别当真
  • %{ #include #include #include <ctype.h> %} %token NUM %left'-''+' %left'*''/' %% input: | input line ; line: '\n' | exp '\n' { } ... 这个过程具体是怎么样的
  • 用java实现计算String类型的四则运算——用栈和后缀表达式实现最近看数据结构,看到栈和后缀表达式的地方,于是自己动手用写了一段很简单的实现计算String类型的四则运算的例子。 思路:给一个String类型的算术计算...
  • 1、逆波兰表达式简介  假定给定一个只 包含 加、减、乘、除,和括号的算术表达式,你怎么编写程序计算出其结果。问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级...  转换为后缀表达式的...
  • 中缀表达式求

    千次阅读 2015-08-07 16:35:19
     中缀表达式值问题  中缀表达式的值问题是一个比较常见的问题之一,我们... 表达式一般来说有三种:前缀表达式、中缀表达式、后缀表达式,其中后缀表达式又叫做逆波兰表达式。中缀表达式是最符合人们思维
  • 中缀表达式求值问题

    2017-10-25 09:24:35
    中缀表达式值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么表达式进行值的,今天我们来一起了解一下其中具体的原理和过程。  表达式...
  • 如果用栈来解决这类问题,需要先变成后缀表达式(这是一种不需要括号的方法):" 9 3 1 — 3 * + 10 2 / +", 那怎么求这个呢? 1.求后缀表达式:将中缀表达式转化为后缀表达式(栈用来进出运算的符号):  ...
  • 中缀表达式求值问题中缀表达式值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么表达式进行值的,今天我们来一起了解一下其中具体的原理和过程...
  • 首先将中缀表达式转换到后缀表达式,然后对后缀表达式求值。加、减、乘、除分别用+,-,*, /,来表示。表达式可以有圆括号()。每个表达式中,圆括号、运算符和运算数相互之间都用空格分隔,运算数是整数,考虑除数为0...
  • 对于1+((2*3)-4)/2 的数学表达式怎么求值? 分析: 数学表达式求值有优先级,不能简单的从左往右依次计算, 需要从优先级高的开始计算 二.中缀表达式 运算符在数值间1+((2*3)-4)/2 ,数学表达式即为中缀表达式。 从左往...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
关键字:

后缀表达式怎么求