1.介绍

表达式分为中缀表达式,后缀表达式和前缀表达式。

前缀表达式又叫波兰式,而后缀表达式又叫逆波兰式,因为一开始研究这个的是个波兰数学家。

其中,我们最熟悉的就是中缀表达式。如下:

(15-2)*3+4/2

表达式分为三个部分,操作数、运算符和界限符。

操作数就是上面的数字,运算符就是加减乘除一类的运算符号,界限符就是我们熟悉的大括号、中括号和小括号。

实际上,界限符是决定运算顺序的符号。

对于五加三,三种表达式有三种不同的表达方式,而其中的意思并没有变化,结果相同。

中缀表达式就是运算符号置于两个操作数之间,如5+3。

而后缀表达式就是将运算符置于两个操作数之后,如 5 3+。

那么前缀表达式就是将运算符置于两个操作数之前,如 +5 3。

注意:这里数字的顺序是不能改变的,尤其对于-*/这三种运算符,这和5-3跟3-5不同是一样的道理。

对于上面的5相同的地位的数称为前操作数,对于上面的3相同的地位的数称为后操作数。

2.操作

我们知道一个表达式最终目的是化为一个操作数,因此,我们就可以在复合表达式中,将某个部分表达式视为一个操作数。

比如说(15-2)*3+4/2,我们就可以将(15-2)*3当成一个操作数去对待,而不用管表达式里面如何如何复杂。

(1)将中缀表达式转换为后缀表达式

举个例子:

(15-2)*3+4/2将这个中缀表示式化为后缀表达式。

我们先确定运算的顺序,如下:

第一步:15 2 -,我们将这个部分表达式视为一个操作数,进行下一步。

第二步: 15 2 - 3 *,操作数顺序不能颠倒。

第三步: 15 2 - 3 * 4 2 /,这里又增加了一个‘操作数’,进行下一步。

第四步: 15 2 - 3 * 4 2 / +,最终的到的式子就是后缀表达式。

其实,有的中缀表达式,不止一个运算顺序,因此,也就有不同的后缀表达式相对应。

如:15/5*3+5-2

我们既可以先算乘法,再算除法,也可以先算除法,再算乘法。

在乘除运算之后,我们既可以先算加法,也可以先算除法。

对于算法来说,算法具有确定性,因此计算机一般转换时都是按‘左优先’算法转换的,即假如运算符的优先级相同,比如*和/这两种运算符,则先从左边开始转化。

也就是说能先从左边开始,就从左边开始。

这样求得的后缀表达式就是唯一的,也可以看到上面我们求后缀表达式的式子,原本的运算顺序为1243,转换后为1234。

上面都是手算,下面来看代码:

代码在最后。

(2)后缀表达式的计算

对于上面我们求出的算数表达式,如果我们想要计算,我们观察这个式子,很快就能相处计算方法。

方法如下:

比如说:上面我们求后缀表达式的中缀表达式式子为(15-2)*3+4/2,经计算为41。

后缀表达式为15 2 - 3 * 4 2 / +

我们采用后缀表达式的计算方法计算一遍。

第一次遇到运算符为‘-’,那么得到15-2=13。

第二次遇到运算符为‘*’,那么得到13*3=39。

第三次遇到运算符为‘/’,那么得到4/2=2。

第四次遇到运算符为‘+’,那么得到39+2=41。

完全和中缀表达式计算得到的结果相同。上面的方法对于哪一种后缀表达式都是适用的。

有了这种思想其实前缀表达式,同样的自己也就可以解决了。

代码在最后。

(3)将中缀表达式转换为前缀表达式

举个例子:

(15-2)*3+4/2将这个中缀表示式化为前缀表达式。

我们先确定运算的顺序,如下:

第一步:/ 4 2,这里的表达式又是一个操作数。

第二步:- 15 2 / 4 2,操作数顺序不能颠倒。

第三步:* - 15 2 3 / 4 2

第四步:+ * - 15 2 3 / 4 2,最终的到的式子就是前缀表达式。

同理,算法具有确定性,因此,规定‘右优先‘,最后将运算的顺序2341转化后为4321。

操作3和4可以自己试着模仿1和2写代码,因此就不给代码了。

(4)前缀表达式的计算

对于上面我们求出的算数表达式,如果我们想要计算,我们观察这个式子,很快就能相处计算方法。

它和后缀表达式的计算方法顺序相反,如下:

举个例子: 计算上面求得的前缀表达式+ * - 15 2 3 / 4 2

从右向左:

第一次遇到运算符’/‘,得到4/2=2。

第二次遇到运算符’-‘,得到15-2=13

第三次遇到运算符’*‘,得到13*3=39

第四次遇到运算符’+‘,得到39+2=41

因此,41就是该前缀表达式的值。

(5)中缀表达式的计算

其实,对于中缀表达式,人是非常好计算的。但对于计算机而言,中缀表达式的计算方法是非常复杂的。

这就需要先将中缀转前缀或者后缀,然后按转换后的表达式的计算方法计算。

代码在最后。

//expression.h
#pragma once
#include<string>
#include<stack>
class expression
{
public:std::string inExpression;//中缀表达式std::string poExpression;//后缀表达式std::string prExpression;//前缀表达式expression(std::string obj);~expression(){};int priority(char op);//运算符的优先级bool isOp(char op);//是否是四种运算符号std::string readInNum(int &i);//读取中缀表达式中数字std::string readPoNum(int &i);//读取后缀表达式中数字void inToPo();//中缀转后缀void inToPr();//中缀转前缀int answer();//表达式结果};
//expression.cpp
#include "expression.h"
expression::expression(std::string obj)
{inExpression = obj;
}
bool expression::isOp(char op)
{if (op == '+' || op == '-' || op == '*' || op == '/')return true;return false;
}
int expression::priority(char op)
{switch (op){case '+':case '-':return 0;case '*':case '/':return 1;default:break;}return -1;
}
std::string expression::readInNum(int &i)
{std::string num;while (isdigit(inExpression[i])){num += inExpression[i];i++;}i--;return num;
}
std::string expression::readPoNum(int& i)
{std::string num;while (isdigit(poExpression[i])){num += poExpression[i];i++;}i--;return num;
}
void expression::inToPo()
{//(15-2)*3+4/2//h//postd::stack<char> h;for (int i = 0; i < inExpression.size(); i++){if (isdigit(inExpression[i])){poExpression += readInNum(i);poExpression += ' ';}else if (inExpression[i] == '(')h.push(inExpression[i]);else if (inExpression[i] == ')'){while (h.top() != '('){poExpression += h.top();poExpression += ' ';h.pop();}h.pop();}else if (isOp(inExpression[i])){//因为栈顶一定是优先级最高的,每次只需要和栈顶元素比较就行while (!h.empty() && priority(inExpression[i]) < priority(h.top())){poExpression += h.top();poExpression += ' ';h.pop();}h.push(inExpression[i]);}}while (!h.empty()){poExpression += h.top();poExpression += ' ';h.pop();}
}
void expression::inToPr()
{}
int cal(int lhs, int rhs,char op)
{switch (op){case '+':return lhs + rhs;case '-':return lhs - rhs;case '*':return lhs * rhs;case '/':return lhs / rhs;default:break;}return 0;
}
int expression::answer()
{std::stack<int>num;for (int i = 0; i < poExpression.size(); i++){if (isdigit(poExpression[i]))num.push(std::stoi(readPoNum(i)));else if (poExpression[i] == ' ')continue;else if (isOp(poExpression[i])){int rhs = num.top();num.pop();int lhs = num.top();num.pop();num.push(cal(lhs, rhs, poExpression[i]));}}return num.top();
}

数据结构——表达式求值相关推荐

  1. 如何利用计算机求函数解析式,数据结构表达式求值(计算器)实验报告(共10篇).doc...

    数据结构表达式求值(计算器)实验报告(共10篇) 数据结构表达式求值(计算器)实验报告(共10篇) 数据结构课程设计_实验报告(一)表达式求值(计算器) 数据结构课程设计 实验报告 起止时间:2015 ...

  2. [数据结构]表达式求值

    一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...

  3. 算术表达式求值的程序设计与实现_数据结构课程设计

    以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...

  4. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  5. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  6. linux算术表达式求值数据结构,数据结构:算数表达式求值演示

    题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...

  7. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  8. python 表达式求值数据结构_python 数据结构与算法

    python 数据结构与算法 1 python常见数据结构性能 1.1 List 1.1.1 安索引取值和赋值 1.1.2 列表append和__add__() 1.1.3 使用timeit模块测试执 ...

  9. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

最新文章

  1. 如何从Exchange Server 2007/2010上删除邮件
  2. linux contos7防火墙加端口,Linux:centos7防火墙开放端口
  3. R语言实现混频数据分析
  4. 作业6--第3、4、5天进度
  5. 算法求解方法与思路的总结
  6. NOR Flash的原理与操作
  7. tplink 文件服务器,tplink云服务器
  8. 嗯… 无法访问此页面 www.bing.com 花了太长时间进行响应解决办法
  9. 抖音获客源码,短视频获客系统,获客SaaS有标准答案吗?
  10. 近段时间参加的CTF竞赛部分题目复现(ISCC2020 、GKCTF、网鼎杯)
  11. 抖音企业号源码部署搭建
  12. 数组.列表.集合.应用
  13. 重庆新地标佛罗伦萨小镇将开业;雅高宣布2021年开业新酒店计划;阅文集团出售懒人听书股权​ | 美通企业周刊...
  14. 腾讯,互联网创业者的噩梦!
  15. A40I工控主板(SBC-X40I)T卡接口,EMMC读写测试
  16. matlab中风力机模块,风力机的Matlab模型及其应用
  17. 京东开源项目之列表解决方案Drip-Table
  18. 006.自营电商 配送网络规划 - 02 配送网点选址 中篇 重心法选址
  19. 你知道怎么查看微信绑定了哪些软件吗
  20. 对定点计算与浮点计算有了新的认识

热门文章

  1. 计算机软件包括程序和指令吗,命令和指令的区别(计算机指令和程序的概念)
  2. SpringBoot 修改 Multipart 文件大小
  3. github 删除仓库内容 上传代码到github仓库
  4. 业务治理流程的风控方法-安全运营心得
  5. java 对象 数据库中_Java将对象直接在数据库中存取的方法
  6. 解决pyCharm界面的中文显示乱码的问题
  7. vue的生命周期 (11个钩子函数)看了都能懂的
  8. 健康食谱输出,5种不同的食材,
  9. 两大绝招 让你的共享茶室脱胎换骨
  10. 如何更改Microsoft Office的颜色主题