数据结构算法之表达式自动计算

算法需求:使用两种发放实现输入表达式的自动计算,准确计算出表达式的值

第一种方法:将中缀表达式转为后缀表达式,然后对后缀表达式进行计算

  1:中缀表达式转后缀表达式:在主函数中通过gets()方法一次性将输入表达式读入,然后调用ChangeExpression()方法进行表达式的转换。首先,定义一个操作符栈,并将其初始化,定义两个循环变量。利用While循环扫描所输入的表达式,对所扫描的每个元素进行判断。  

  (1):若扫描为数字或小数点,则将所扫描元素赋值给字符数组change[]

  (2):若扫描为操作符:则先判断操作符栈是否为空,若为空,则直接压入操作符栈。若不为空,将change[]数组中加个$符号,用于后面计算时扫描整个数字,然后判断当前所扫描元素是否为右括号,若是右括号,则判断栈顶元素是否为左括号,若是,将左括号弹出操作符栈;若栈顶元素不是左括号,则用While循环将栈顶元素弹出,直到栈顶元素为左括号,然后将左括号弹出操作符栈。若当前所扫描元素不是右括号,则调用操作符优先级比较函数比较当前所扫描元素与栈顶元素的优先级:如果所扫描元素的优先级高于栈顶元素时,将所扫描元素直接入栈;如果当前所扫描元素优先级低于栈顶元素时,判断栈顶元素是否为左括号,若是,当前扫描元素直接入栈,若不是,则栈顶元素出栈进数组,直到所扫描元素高于栈顶元素的优先级为止,然后将当前所扫描元素直接入操作符栈。本次循环结束,i++,进行下一次循环,直到遇见\0,While循环结束。最后判断操作符栈是否为空,若不为空,则将操作符栈中操作符全部弹出,赋给数组。

  2:后缀表达式计算:定义一个数字栈,并将数字栈初始化为空。定义一个临时存放数数字的字符型数组str[],定义一个指向临时数组的指针*str,定义循环变量。利用While循环扫描数组:首先判断当前所扫描元素是否为$符号,若是,则i++;若不是,则判断当前扫描元素是否为数字或小数点,若是,则循环扫描整个数字,以便数字为小数时获得一个完整的小数。将扫描数字赋给str[]数组,然后利用st=str令指针指向临时数组str[],利用atof()函数将字符型转为浮点型,并压入数字栈。若扫描不是数字或小数点,弹出两个数字一个操作符,调用SymbolCal(float popNum1, float popNum2, char popSymbol2)函数进行计算,将计算结果压入数字栈。注意:判断当前元素是否为$符号,若是则不进行弹出计算操作。数字栈栈顶元素即为运算结果      ,弹出返回。

中缀转后缀表达式是数据结构中一种比较常见的算法,逻辑性很强,应该每一步仔细的查看

 

转载于:https://www.cnblogs.com/WuNaiHuaLuo/p/4135227.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用两种方式实现表达式自动计算 对栈的应用 (1)中缀表达式转后缀表达式计算(扫两遍) 创建一个数组存储输入的计算表达式。另创建一个数组储存将要生成的后缀表达式。创建一个栈储存操作符。 对已存储的表达式数组扫描。 判断当前节点,如果是操作数或’.’,直接加入后缀表达式中,如果是操作符,则比较前一个操作符与当前操作符的优先级。如果前一个操作符的优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈。 如果遇到左括号’(’,直接入栈;如果遇到右括号’)’,则在操作符栈中反向搜索,直到遇到匹配的左括号为止,将中间的操作符依次加到后缀表达式中。 当执行完以上操作,发现栈中仍有剩余操作符,则将操作符依次加到后缀表达式中。此时中缀表达式已经转换成了后缀表达式。 对后缀表达式进行计算。 如果后缀表达式为大于0小于9的字符,则将它转换成浮点型数据并存入数栈中。如果遇到操作符,则从数栈中提取两个数,进行相应的运算。依次进行下去,当没有运算符是,运算结束得到最后的结果。 (2)表达式求值(扫一遍) 创建一个数组存储输入的计算表达式。创建两个栈,一个字符型的栈,一个双精度型的栈。分别用来存储字符和数。 对已存储的表达式数组扫描。 判断当前节点,如果是操作数和’.’,将字符型的操作数转换为浮点型的数后存入操作数栈。 如果是操作符则判断操作符的优先级。如果字符栈中已存储符号的优先级小于要存入的字符的优先级,则直接让字符入操作符栈。如果字符栈中已存储符号的优先级大于或等于要存入的字符的优先级,则取出操作符栈中的一个字符和操作数栈中的两个数进行计算,然后将结果存入操作数栈中,同上进行下去,直到字符栈中已存储符号的优先级小于要存入的字符的优先级时,将操作符存入操作符栈中。 当遇到左括号’(’,将左括号直接存入操作符栈中。当遇到右括号’)’,则在操作符栈中反向搜索,并且每搜到一个字符就在操作数栈中取两个数进行相应的计算。然后,将运算结果存入到操作符栈中。如此进行下去,直到遇到左括号结束。将左括号从栈中取出。最后,如果操作符栈中还有符号,就从操作符栈顶开始将操作符取出并从操作数栈顶开始取出两个数字进行计算,将结果存入操作数栈中。重复上述操作直到操作符栈中没有操作符,得到运算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值