码迷,mamicode.com
首页 > 编程语言 > 详细

计算器的算法实现

时间:2017-10-14 23:39:21      阅读:366      评论:0      收藏:0      [点我收藏+]

标签:数字   小数   code   算法实现   group   style   sdi   roc   转化   

重点有:

  1. 将输入的表达式转化为逆波兰表达式
  2. 操作符进出栈处理
  3. 检测小数或多位数的情况
  4. 本算法实现采用从左向右计算

想想学数据结构的时候还是大一下学期,转眼·····岁月是把猪食料。说点重点,计算器用到的知识点主要就是栈的应用,操作符进、出栈的处理,以及碰到括号的时候处理的方式。如果你C语言用的比较顺手,建议用C语言处理,能对栈的知识加强理解和应用。

本算法实现时,先将乘除运算处理,之后剩余的加减从左向右一次计算。但还是希望你看下关于波兰表达式的知识。

Python代码如下:

import re
you_put=input("输入你要计算的算式:\n")
num_stack=[]#用于对数字的存储
str_stack=[]#用于对操作符的存储
i=0
def cal(x,y,st):
    res=0
    x=float(x)
    y=float(y)
    if st is +:
        res=x+y
    elif st is -:
        res=x-y
    elif st is *:
        res=x*y
    else:
        res=x/y
    return res
def process(num_stack,str_stack):
    st = str_stack.pop()
    num_stack[len(num_stack) - 2] = cal(num_stack[len(num_stack) - 2],    num_stack[len(num_stack) - 1], st)
    num_stack.pop()
while i<len(you_put):
    #判断扫描到的s[i]是操作数
    if you_put[i].isdigit():
        #当数值为多位数时,采用正则匹配
        num=(re.search(r(\d+),you_put[i:])).group()
        length=len(num)
        #先将‘*‘或者‘/‘计算出结果。例如:1-2*3-->1-6
        if len(num_stack)>0 and str_stack[len(str_stack)-1] in [*,/]:
            num=cal(num_stack[len(num_stack)-1],num,str_stack[len(str_stack)-1])
            num_stack[len(num_stack)-1]=num
            str_stack.pop()
        else:
            num_stack.append(num)
        i+=length
        continue
    if you_put[i] is (:
        #扫描到的s[i]是开括号‘(‘,将s[i]压栈;
        str_stack.append(you_put[i])
        i+=1
        continue
    if you_put[i] in [+,-,*,/,(]:
        #栈顶为‘(‘ 或 扫描到的操作符优先级比栈顶操作符高
        if you_put[i] in [*,/,(]:
            str_stack.append(you_put[i])
            i+=1
            continue
        else:
            if len(str_stack)==0:
                str_stack.append(you_put[i])
                i += 1
                continue
            elif str_stack[len(str_stack)-1] in [*,/]:
                process(num_stack,str_stack)
                str_stack.append(you_put[i])
                i+=1
                continue
            else:
                str_stack.append(you_put[i])
                i+=1
                continue
    if you_put[i] is ):
        while str_stack[len(str_stack)-1] is not (:
            process(num_stack, str_stack)
        str_stack.pop()    #弹出‘(‘
        i+=1
while len(num_stack)>1:
    #因为之前已经将‘*‘,‘/‘计算过,所以现在仅剩‘+‘,‘-‘
    temp=0
    st = str_stack.pop(temp)
    num_stack[temp+1] = cal(num_stack[temp],num_stack[temp+1], st)
    num_stack.pop(temp)
print(num_stack[0])

运行结果截图如下:

技术分享

测试较少,如有错误或不妥之处,请多指出。

计算器的算法实现

标签:数字   小数   code   算法实现   group   style   sdi   roc   转化   

原文地址:http://www.cnblogs.com/xsmile/p/7668775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!