zoukankan      html  css  js  c++  java
  • 数据结构算法之表达式自动计算

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

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

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

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

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

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

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

  • 相关阅读:
    编程之美---求数组中最长递增子序列
    编程之美----子数组的最大乘积
    编程之美----寻找数组中的最大值和最小值
    编程之美---找符合条件的整数
    编程之美----最大公约数问题
    编程之美----1的数目
    编程之美----寻找发帖“水王”
    C语言 |= &= 位运算
    整型数类型定义
    extern使用方法总结!(转)
  • 原文地址:https://www.cnblogs.com/WuNaiHuaLuo/p/4135227.html
Copyright © 2011-2022 走看看