计算器这个程序的道理。

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 若出现"="终止符号输出栈中所有剩余符号 ()

猜你喜欢

转载自www.cnblogs.com/luozhonghao/p/9097356.html