表达式(四则运算)计算的算法

(1).后缀表达式让操作数和中缀表达式的操作数先后次序相同,只是运算符的先后次序改变;

(2).后缀表达式没有括号,运算次序就是其执行次序。

在计算机内部,任何一个表达式都是由操作数、运算符和分界符组成。操作数和运算符是表达式的主要部分,分界符(如用#表示)标志了一个表达式的结束。我们把操作数、运算符和分界符称为表达式的单词

一个中缀表达式的四则运算规则:

1.先乘除后加减

2.先括号内后括号外

3.同级别时先左后右

下面以A+(B-C/D)*E为例对过程进行讲解。A+(B-C/D)*E转换成后缀表达式后为

ABCD/-E*+

其运算次序为:T1=CD/; T2=BT1-; T3=T2E*; T4=AT3+。

基于后缀表达式的两个特点,计算过程如下:计算时只要从左到右依次扫描后缀表达式的各个单词,当读到的单词为运算符时,就对该运算他会前两个操作数进施以此运算所代表的操作,然后将结果T插入到后缀表达式中再重复上面的操作。

享受过程——实现步骤和方法

==========================================================================

根据以上的讲解,可初步地列出实现的步骤如下:

1.把中缀表达式的字符中提取出一系列表达式单词;

2.把中缀表达式单词系列转换成后缀表达式单词系列;

3.对后缀表达式词系列依次进行计算。

下面依次对各个步骤进行讲解。

把中缀表达式的字符中提取出一系列表达式单词


要提取表达式单词,首先要定义一个单词的类,判断该字符串是否是数字还是运算符

代码如下

/**

  • 判断当前字符或字符串是否是数字

  • @param str

  • @return

*/

public static boolean isNumber(String str) {

return str.startsWith(“0”) || str.startsWith(“1”)

|| str.startsWith(“2”) || str.startsWith(“3”)

|| str.startsWith(“4”) || str.startsWith(“5”)

|| str.startsWith(“6”) || str.startsWith(“7”)

|| str.startsWith(“8”) || str.startsWith(“9”)

|| str.startsWith(“.”);

}

将算式表达式转换成操作数和运算符,放入链表中

/**

  • 分析四则运算表达式,将数字与运算符进行分解

*/

public static List parse(String exp) {

int length = exp.length();

// 四则运算解析

List expList = new ArrayList();

String tempStr = “”;

for (int i = 0; i < length; i++) {

String tempChar = exp.substring(i, i + 1);

if (DataUtils.isNumber(tempChar)) {// 如果是数字的话

tempStr += tempChar;

} else {

if (!tempStr.equals(“”)) {// 遇到运算符,判断存储的数字字符串是否为空

expList.add(tempStr);

}

expList.add(tempChar);

tempStr = “”;

}

}

if (!tempStr.equals(“”)) {// 保证最后一个非空的数字字符串添加到expList中

expList.add(tempStr);

}

return expList;

}

把中缀表达式单词系列转换成后缀表达式单词系列


中缀表达式转换成后缀表达式的算法步骤:(1).设置一个堆栈S,初始时将栈顶元素设置为#。(2).顺序读入中缀表达式,当读到的单词为操作数时将其加入到线性表L, 并接着读下一个单词。(3).令x1为当前栈顶运算符的变量,x2为当前扫描读到的运算符的变量,当顺序从中缀表达式中读入的单词为运算符时就赋予x2;然后比较x1与x2的优先级,若优先级x1>x2,将x1从S中出栈,并加入L中,接着比较新的栈顶运算符x1与x2的优先级;若优先级x1<x2,将x2入栈S,接着读下一个单词;若优先级x1=x2且x1为”(”而x2为”)”,将x1出栈,接着读下一个单词;若优先级x1=x2且x1为”#”而x2为”#”,算法结束。

各运算符优先级关系表

x2

x1

+

-

×

÷

(

)

#

+

>

>

<

<

<

>

>

-

>

>

<

<

<

>

>

×

>

>

>

>

<

>

>

÷

>

>

>

>

<

>

>

(

<

<

<

<

<

=

$

)

>

>

>

>

$

>

>

#

<

<

<

<

<

$

=

表中x1为+或-,x2为*或/时,优先级x1<x2,满足中缀表达式规则1.先乘除后加减;x1为+、-、*或/,x2为(或/时,优先级x1<x2,满足中缀表达式规则2.先括号内后括号外;当x1的运算符x2的运算符同级别时,优先级x1=x2,满足中缀表达式规则3.同级别时先左后右。出现表中的$表示中缀表达式语法出错。

中缀表达式转换成后缀的过程

步骤

中序表达式

堆栈

输出

1

A+(B-C/D)*E#

#

2

+(B-C/D)*E#

#

A

3

(B-C/D)*E#

#+

A

4

B-C/D)*E#

#+(

A

5

-C/D)*E#

#+(

AB

6

C/D)*E#

#+(-

AB

7

/D)*E#

#+(-

ABC

8

D)*E#

#+(-/

ABC

9

)*E#

#+(-/

ABCD

10

*E#

#+(-

ABCD/

11

*E#

#+(

ABCD-

12

*E#

#+

ABCD-

13

E#

#+*

ABCD-

14

#

#+*

ABCD-E

15

#

#+

ABCD-E*

16

#

#

ABCD-E*+


/**

  • 将分解后的四则运算列表构建成逆波兰表达式列表

*/

public static List createRPN(List expList) {

Stack stack = new Stack();

// 存放逆波兰表达式

List rpnList = new ArrayList();

int length = expList.size();

for (int i = 0; i < length; i++) {

String c = expList.get(i);

// 如果是数字,直接放到逆波兰链表的最后

if (DataUtils.isNumber©) {

rpnList.add©;

} else {

// 如果不是数字

// 如果是左括号,则直接将左括号压入栈

最后

一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中…(img-zfyspRr7-1715366162478)]

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值