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. 使用Caffe进行手写数字识别执行流程解析
  2. c++ssh连接_一步步使SSH连接您的github仓库
  3. JS版数据结构第三篇(链表)
  4. Ubuntu远程操作Linux服务器GUI程序
  5. 母版页可以动态切换吗?
  6. 虚拟化精华问答 | 什么是虚拟化?
  7. 【CAM应用】谈CAM软件在实际生产中的应用举例
  8. App Ratings iOS
  9. 我的世界电脑正版服务器地址大全,我的世界服务器地址有哪些_服务器地址大全_3DM网游...
  10. JDK下载 JVM调优工具jvisualvm下载
  11. 饿了么UI组件库中,Upload组件上传闪动的解决
  12. Java打包后运行找不到资源文件问题
  13. 【古代文学论文】沈德潜诗学思想的调和格调与文化意蕴(节选)
  14. java手机号码格式验证
  15. 可视化展示——实现论文引用关系动图展示
  16. 约瑟夫生者死者游戏:有N个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难;无奈,大家只得同意这种办法,并议定N个人围成一圈,由
  17. win10安装docker导致virtualbox无法启动问题解决
  18. 什么是MyBatis?怎么操作MyBatis?
  19. cpri和10g-kr的关系?
  20. getNetworkInfo

热门文章

  1. 豆豆趣事[2010年10月]
  2. Windows客户端开发面经(2021-03)
  3. groovy使用全局变量
  4. 关于hadoop集群搭建后,访问Browse Directory目录的权限问题
  5. ruby+watir-webdriver自动化测试入门
  6. Webgoat学习笔记
  7. AI导论-调用百度AI开放平台进行图象识别
  8. 什么是序列化?如何实现序列化
  9. Violence detection-Hockey Fight-CNN+LSTM暴力检测CNN+LSTM实例
  10. 6.9mm惊世骇俗 最薄手机三星X828全球抢先预览,WM5.0系统强援!首款数字电视SmartPhone曝光