计算器这个程序的道理。
Posted luozhonghao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算器这个程序的道理。相关的知识,希望对你有一定的参考价值。
1.逆波兰表达式的计算
n目运算符前面有n个连续的数字 那n目运算符的操作对象一定是这n个数字 然后进行计算用一个数代替n+1个字符
这种计算方式可以说是逆波兰表达式的定义 即运算方式定义了表达式的真实含义。
2.中缀表达式到逆波兰表达式的转换思路
假设前面已经输入了2个运算数字A,B和他们之间的一个运算符号c
①如果下一个运算符d的优先级小于等于c 那么c的操作对象一定是AB两数
且AcB可以看做一个数字A‘ 对应逆波兰表达式是ABc 故输出ABc
又输入一个数B‘,有了A‘d B‘
继续判断①或②
②如果下一个运算符d的优先级大于c
那么c的操作对象一定为A以及包含B的一个整体Group Group是总串中Bd以及Bd之后的连续的一串字符
利用③确定了Group之后 可以将AcGroup看做一个数字A‘ 对应的波兰表达式是AGroupc 故输出AGroupc
然后输入 一个运算符c’和数字B‘有了A‘d B‘
继续判断①或②
③Group唯一的要求是不含有小于等于②中c优先级的运算符,即Group后继字符为小于等于c优先级的运算符
将Group看做一个全新的表达式(Group的字符对括号内的输出方式没有影响)判断其中的①②并输出
④如果出现了括号
将括号中的内容视为全新的表达式,利用①②③输出(即括号外的字符对括号内的输出方式没有影响)
⑤ 如果出现了单目运算符sin()之类
将括号内的表达式使用④的办法输出并在后面添上对应符号(如sin对应S)
⑥如果出现"="终止符号,若输入合法,即可立即终止程序
3.中缀表达式到逆波兰表达式的转换实现方法,利用栈实现2中的过程
输入的数字可以立即输出,在输入下一个运算符时判断是否输入上一个运算符即可
s1
若符号栈中没有运算符则入栈(没有运算符,已输出符号可以视为一个数字)
若输入运算符k优先级小于栈顶运算符 则将栈栈顶运算符输出,如果仍高于新的栈顶元素,又将栈顶元素输出(栈顶元素操作的整体不包含k,在k之前输出)
若输入运算符k优先级高于栈顶的运算符 则将输入运算符压栈 (栈顶操作的整体包含k,k一定在栈顶元素之前输出)
s2 若出现"("压入,当做新的栈底执行 s1直到输入")"
s3 若出现"="终止符号输出栈中所有剩余符号 ()
以上是关于计算器这个程序的道理。的主要内容,如果未能解决你的问题,请参考以下文章