快捷搜索:

支持四则混合运算的计算器

1.给出两个数,用户再指定操作符,要求谋略结果,这实现起来很轻易;

2.多个数,但只涉及同一优先级的操作符,做起来也很轻易;

3.多个数,不合优先级的操作符,怎么办呢?

想想就头痛,不过还好昔人已经为我们留下了很多办理这个问题的措施。经由过程逆波兰表达式是办理这个问题很盛行的一种要领。

一、什么是逆波兰表达式?

我们一样平常应用的表达式,形如1+2*3,被称为中缀表达式,转换为后缀表达式即为:1 2 3 * +,而后缀表达式也便是我们所说的逆波兰表达式。

逆波兰表达式谋略起来异常方便:遇操作数入栈,遇操作符则弹出栈顶两个元素进行谋略并将结果推入栈中,直至停止。上面的表达式的谋略历程可以用下图表示:

也正由于逆波兰的方便性,使它成为了谋略器的普遍实现要领。

二、四则混杂运算谋略器

既然思路已经清晰了,那么我们的谋略器可以分两步走:

1.将表达式转换为逆波兰形式

2.逆波兰表达式求值。

天生逆波兰表达式:

将一样平常中缀表达式转换为逆波兰表达式有如下转换历程:

(1)首先构造一个运算符栈,此运算符在栈内遵照越往栈顶优先级越高的原则。

(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优 先级最低的特殊符号“#”。

(3)从左至右扫描该算术表达式,从第一个字符开始判断,假如该字符是数字,则阐发到该数字串 的停止并将该数字串直接输出。

(4)假如不是数字,该字符则是运算符,此时需对照优先关系。

做法如下:将该字符与运算符栈顶的运算符的优先关系相对照。假如,该字符优先关系高于此运算符 栈顶的运算符,则将该运算符入栈。假使不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。

(5)重复上述操作(3)-(4)直至扫描完备个简单算术表达式,确定所有字符都获得精确处置惩罚,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

而上面提到的运算符优先级如下:

操作符

#

^

*,/,%

+,-

(

)

isp(栈内优先级)

0

7

5

3

1

8

icp(栈外优先级)

0

6

4

2

8

1

下面是法度榜样化算法流程:

1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。

2、预处置惩罚表达式,正、负号前加0(假如一个加号(减号)呈现在最前面或左括号后面,则该加号 (减号)为正负号) 。

3、顺序扫描表达式,假如当前字符是数字(优先级为0的符号),则直接输出该数字;假如当前字 符为运算符或括号(优先级不为0的符号),则判断第4点 。

4、若当前运算符为'(',直接入栈;

若为')',出栈并顺序输出运算符直到碰到第一个'(',碰到的第一个'('出栈但不输出;

若为其它,对照stackOperator栈顶元素与当前元素的优先级:

假如 栈顶元素 >= 当前元素,出栈并顺序输出运算符直到 栈顶元素///

/// 处置惩罚正负号

///

///

///

private static string FormatExp(string exp)

{

var result = exp.Trim().WordStr(" ", "");

if (result[0] == '+' || result[0] == '-')

{

result = "0" + result;

}

for (var i = 0; iresult.Length - 1; i++)

{

if (result[i] == '(' && (result[i + 1] == '+' || result[i + 1] == '-'))

{

result = result.Substring(0, i + 1) + "0" + result.Substring(i + 1);

}

}

return result;

}

您可能还会对下面的文章感兴趣: