逆波兰表达式(后缀表达式)

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。下面是一些例子:

正常的表达式 逆波兰表达式

a+b ---> a,b,+

a+(b-c) ---> a,b,c,-,+

a+(b-c)*d ---> a,b,c,-,d,*,+

a+d*(b-c)--->a,d,b,c,-,*,+

a=1+3 ---> a=1,3 +

通过后缀表达式计算表达式值的过程:顺序访问表达式的每一项,若该项为操作数,则将其压入栈中;若该项是操作符<op>,则连续从栈中退出两个操作数X和Y,形成运算指令X<op>Y,将其结果重新压入栈中。当表达式的每一项都访问并处理,则其计算结果就是当前栈顶存放的值。

下面我们以表达式4+3*4+3*(1+5)———>434*+315+*+

源程序:

#pragma once
#include<iostream>
#include<assert.h>
#include<stack>
using namespace std;

enum Type
{
    OP_NUM,
    OP_SYMBOL,
};

enum SYMBOL
{
    ADD,
    SUB,
    MUL,
    DIV,
};
struct Cell
{
    Type _type;
    int _value;
};
double CountRNP(Cell *a, size_t size)
{
    assert(a);
    stack<double> s;
    double right = 0;
    double left = 0;
    for (size_t i = 0; i < size; i++)
    {
        if (a[i]._type == OP_NUM)
        {
            s.push(a[i]._value);
        }
        else
        {
            if (s.empty())
            {
            return 0;
            }
            right = s.top();
            if (s.empty())
            {
            return 0;
            }
            s.pop();
            left = s.top();
            s.pop();
            switch (a[i]._value)
            {
            case ADD:
                s.push(left + right);
                break;
            case SUB:
                s.push(left - right);
                break;
            case MUL:
                s.push(left * right);
                break;
            case DIV:
                if (left== 0)
                    {
                        cout << "error" << endl;
                    }
                else
                    {
                       s.push(right / left);
                    }    
                break;
            }
        }
    }
    return s.top();
}

测试代码:

#include"calculate.h"
int main()
{
    Cell a[] = { { OP_NUM, 4 }, { OP_NUM, 3 }, { OP_NUM, 4 },
    { OP_SYMBOL, MUL }, { OP_SYMBOL, ADD }, { OP_NUM, 3 }, { OP_NUM, 1 }
    , { OP_NUM, 5 }, { OP_SYMBOL, ADD }, { OP_SYMBOL, MUL }, { OP_SYMBOL, ADD } };
    size_t size = sizeof(a) / sizeof(a[0]);
    cout << CountRNP(a, size) << endl;
    system("pause");
    return 0;
}

结果:

时间: 2024-08-04 19:57:00

逆波兰表达式(后缀表达式)的相关文章

逆波兰表达式(后缀表达式)

前/中/后缀表达式的转换 自然表达式转换为前/中/后缀表达式,其实是很简单的.首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式. 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

中缀表达式-&gt;后缀表达式

中缀表达式:之前我们接触过的那种操作数+操作符+操作数形式的表达式 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 * 中缀表达式转换成后缀表达式的代码: void postfix(char e[],char f[])//e是中缀表达式 f是后缀表达式. { int i = 0,top = 0,j = 0; char opst[100]; top = 0; opst[

逆波兰式与表达式求解

/*************** 逆波兰式即后缀表示法 预处理 ---- 中序表达式->逆序表达式(infix to postfix) 算法: while(表达式非空) if (遇到操作数) 直接输出 else if (遇到操作符op) op是( 直接入栈s op是) s.push输出,直到( op是四则运算,则 if (s为空 || s.top为( || op 优先级高于 s.top) op 入栈 else s.push输出 if (!s.empty) s.push输出 计算 算法: if (

前缀表达式、中缀表达式和后缀表达式

前缀.中缀.后缀表达式 前缀.中缀.后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理 举例: 中缀表达式:1 + (2 + 3) × 4 - 5 前缀表达式:- + 1 × + 2 3 4 5 后缀表达式:1 2 3 + 4 × + 5 - 中缀表达式 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中

1470 数据结构:逆波兰表达式

本题难点有二: 其一为波兰表达式递归求值算法的理解: 其二为处理多组数据,scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.注意exit()与return的区别 关于波兰(前缀)表达式.中缀表达式.逆波兰(后缀)表达式的详细介绍,请参考:http://www.cnblogs.com/chenying99/p/3675876.html 另外,指出本题的一个小错误,应把题目中所有的“逆波兰”改为“波兰”. // 测试用例: // * - 2 3 4 // - 3 2 // - 7

后缀表达式实战:Qt制作计算器

导言 相信学过数据结构的人都听说过后缀表达式,就是在学习栈的时候.可能也有很多人实现过这一算法,不过基本上也都是在控制台窗口里用用.相信大家也都用过计算器windows里面的calc.但是有没发现它只能单步计算,而不能一次计算一个表达式.后缀表达式就有了用武之地,可以一次性计算一整个个式子.科技要为生产服务,所以我就实际去做了一个依据后缀表达式的带有图形化界面的计算器. 什么是后缀表达式 后缀表达式又称逆波兰式,用于简化计算数学表达式,是计算器类软件开发的重要理论依据.这部分有两个要点: 中缀表

前缀、中缀、后缀表达式以及简单计算器的实现

前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面.为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”.例如,- 1 + 2 3,它等价于1-(2+3). 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间. 后缀表达式 后缀表达式指

中缀表达式与后缀表达式

计算中缀表达式"可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点.可以说,这是一道必须要掌握的算法题.中缀表达式.后缀表达式等概念在这里就不赘述了,让我们直奔主题.题目:输入一个中缀表达式,计算其结果.输入的前提假设:(1)只考虑+.-.*./这四种运算符,中缀表达式中只有一种括号:():(2)输入的中缀表达式中只有整数,没有小数:(3)假定输入是合法的.很多文章或课本喜欢一步到位,直接讨论如何从中缀表达式计算结

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括