1. #第五周的作业--多功能计算器
    #1.实现加减乘除及括号的优先级的解析,不能使用eval功能,print(eval(equation))
    #2.解析复杂的计算,与真实的计算器结果一致
    #用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,
    # 必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
    ''' 1.自左向右扫描表达式,凡是遇到操作数一律进操作数栈。
    2.当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级低就入栈。反之,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶的运算符的优先级。
    3.左括号一律进运算符栈,右括号一律不进运算符栈,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,直到取出左括号为止。

  1. #给一个点,我们能够根据这个点知道一些内容
  2. class Node(object):
  3. def __init__(self,val): #定位的点的值和一个指向
  4. self.val=val #指向元素的值
  5. self.next=None #指向的指针
  6. class Stack(object):
  7. def __init__(self):
  8. self.top=None #初始化最开始的位置
  9. def peek(self): #获取栈顶的元素
  10. if self.top!=None: #如果栈顶不为空
  11. return self.top.val #返回栈顶元素的值
  12. else:
  13. return None
  14. def push(self,n):#添加到栈中--入栈
  15. n=Node(n) #实例化节点
  16. n.next=self.top #顶端元素传值给一个指针
  17. self.top=n #新入栈的节点作为栈顶元素
  18. return n.val
  19. def pop(self): #出栈
  20. if self.top == None:
  21. return None
  22. else:
  23. tmp=self.top.val
  24. self.top=self.top.next #栈顶下移一位
  25. return tmp
  26.  
  27. # if __name__=="__main__":
  28. # s=Stack()
  29. # s.push(1)
  30. # s.push(2)
  31. # s.push(3)
  32. #
  33. # print(s.pop())
  34. # print(s.pop())
  35. # print(s.pop())

python 实现栈

  1. 下面是计算器的代码,引用了上面的栈的模块
  1. #_*_coding:utf-8_*_
  2. #第五周的作业--多功能计算器
  3.  
  4. import string
  5. import re
  6. from stack_test import Node,Stack
  7. # 定义加法运算
  8. def add(num1,num2):
  9. return num1+num2
  10. # 定义减法运算
  11. def sub(num1,num2):
  12. return num1-num2
  13. # 定义乘法运算
  14. def mult(num1,num2):
  15. return num1*num2
  16. # 定义除法运算
  17. def div(num1,num2):
  18. return num1/num2
  19. # 定义运算的操作
  20. operation={
  21. "+":add,
  22. "-":sub,
  23. "*":mult,
  24. "/":div
  25. }
  26. #判断一个字符串是否是数字
  27. def is_number(s):
  28. try:
  29. float(s)
  30. return True
  31. except ValueError:
  32. pass
  33.  
  34. try:
  35. import unicodedata
  36. unicodedata.numeric(s)
  37. return True
  38. except (TypeError, ValueError):
  39. pass
  40.  
  41. return False
  42.  
  43. # 定义运算符的优先级别
  44. weight={
  45. '(':3,
  46. '*':2,
  47. '/':2,
  48. '+':1,
  49. '-':1,
  50. None:0
  51. }
  52.  
  53. # 进行运算
  54. num1=0
  55. num2=0
  56. result=0#用于表示计算的
  57. data_stack=Stack()#实例化的一个数栈,存放数
  58. oper_stack=Stack()#实例化的一个符号栈,存放+-*/()
  59. def deal_data():
  60. p=oper_stack.pop()#把运算符出栈
  61. num2=float(data_stack.pop())
  62. num1=float(data_stack.pop())
  63. result=operation[p](num1,num2)
  64. print("%s %s %s临时结果:%s"%(num1,p,num2,result))
  65. print("把计算的结果%s继续存入数栈中"%result)
  66. data_stack.push(result)
  67. return result
  68.  
  69. while True:
  70. equation=input("请输入计算的式子(*提示英文状态下):")
  71.  
  72. # 对输入的算式字符串进行解析,eg:3*5,(99.8-52)*7+6-1.2*41
  73. #1.2-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
  74.  
  75. while equation:
  76. cur=re.search(r'((^\d+\.?\d*)|(^\(\-\d+\.?\d*)|\(|\)|\+|\-|\*|/)',equation).group()
  77. print("----->",cur)
  78. if "(-" in cur:#考虑到负数的情形,如(-5.2)
  79. # 一分为二,"("与"-4"
  80. # 把左括号存入到符号栈中
  81. bracket=cur[0]
  82. print("----->",bracket)
  83. print("将%s存入到符号栈中"%bracket)
  84. oper_stack.push(bracket)
  85. equation=equation[1:]
  86. print("剩余的equation:",equation)
  87.  
  88. # 把负数存入到符号栈中
  89. num=cur[1:]
  90. print("----->",num)
  91. print("将%s存入到数栈中"%num)
  92. data_stack.push(num)
  93. equation=equation[len(num):]
  94. print("剩余的equation:",equation)
  95. else:#非负情形
  96. lenth=len(cur)
  97. if is_number(cur):#数字则存入数栈
  98. print("将 %s 存入数栈data_stack"%cur)
  99. data_stack.push(cur)
  100. else:#非数字的符号
  101. if cur=="(":#左括号一律入栈
  102. print("将%s存入到符号栈中"%cur)
  103. oper_stack.push(cur)
  104. elif cur==")":#右括号则--将取两个数进行运算
  105. deal_data()#处理数据的运算
  106. #(12-5*8)再次判断“(”是否是符号栈的栈顶
  107. while oper_stack.peek()!="(":
  108. deal_data()
  109. oper_stack.pop()#把左括号出栈
  110.  
  111. else:#运算符
  112. if oper_stack.peek()==None:#符号栈为空
  113. print("将%s存入到符号栈中"%cur)
  114. oper_stack.push(cur)
  115. else:#符号栈不为空
  116.  
  117. if weight[cur]>weight[oper_stack.peek()]:#当前符号优先级“高于”栈顶元素的优先级
  118. print("将%s存入到符号栈中"%cur)
  119. oper_stack.push(cur)
  120. else:#当前符号优先级“等于|低于”符号栈栈顶元素的优先级
  121. if oper_stack.peek()=="(":
  122. print("将%s存入到符号栈中"%cur)
  123. oper_stack.push(cur)
  124. else:
  125. deal_data()
  126. while weight[cur]==weight[oper_stack.peek()]:
  127. deal_data()
  128. print("将%s存入到符号栈中"%cur)
  129. oper_stack.push(cur)
  130.  
  131. equation=equation[lenth:]
  132. print("剩余的equation:",equation)
  133. # 把算式逐个拆解完了,最后处理栈中还剩余的数据
  134. result=deal_data()
  135. while oper_stack.peek()!=None:
  136. result=deal_data()
  137.  
  138. print("计算的结果为:\033[31;1m%s\033[0m"%result)

python利用栈实现复杂计算器

python 利用栈实现复杂计算器的更多相关文章

  1. python 利用正则构建一个计算器

    该计算器主要分为四个模块: weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式: add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值 ...

  2. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  3. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  4. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  5. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  6. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  7. Python全栈考试-部分试题(精选)

    Python全栈考试(一) Python全栈考试(一) 1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py ...

  8. Python全栈之路目录结构

    基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...

  9. 【DataStructure In Python】Python模拟栈和队列

    用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...

随机推荐

  1. MySQL子查询subquery

    子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如: select * from t1 where col1=(select col2 from t2); 其中select ...

  2. 使用git配合idea使用oschina代码仓库初级教程

    http://git.oschina.net/ 这个是开源中国的代码仓库是免费的,可以建100和仓库,私有也是免费的 第一步,创建 oschina代码仓库,这里就忽略了.很简单.去注册一个简单几步就可 ...

  3. ZOJ 2856 Happy Life

    Problem Description Do you know Utopia? It's a perfect world in which everyone leads a happy life. A ...

  4. python-入门教程(-)

    # hello worldprint("hello world") # 变量msg = "使用变量"print(msg) # 字符串大小写变换(仅针对英文)na ...

  5. 006.ASP.NET MVC ActionResults说明

    原文:http://rachelappel.com/asp.net-mvc-actiohttp://i.cnblogs.com/EditPosts.aspx?postid=3857238&up ...

  6. Centos7 linux下 安装 Redis 5.0

    网上找了很多文章,发现不全而且有些问题,安装很多次之后,总结一篇可以使用的,记录之. 环境:Centos7+Redis 5.0,如果环境不符合,本篇仅供参考. 1.准备工作 作者习惯软件安装包放在单独 ...

  7. RabbitMQ如何解决各种情况下丢数据的问题

    1.生产者丢数据 生产者的消息没有投递到MQ中怎么办?从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息. transaction机制就是 ...

  8. java unsupported major.minor version 51.0 解决

    1.概述 出现如题所述异常 是因为jdk高版本 编译后的class文件 运行在低版本的jre环境下(如jdk7编译 运行在jdk6环境下) 2. 解决方案 在eclipse等ide中重新编译 指定编译 ...

  9. Tjoi2016&Heoi2016 字符串

    传送门 另一个传送门 终于把心头大恨切掉了……后缀自动机大法好,从此抛弃后缀数组哈哈……(说的跟你会写后缀数组似的 好像网上的题解大多都是后缀数组?看了看表示理解不能,那我这份后缀自动机的题解就写详细 ...

  10. FFT板子

    woc......FFT这玩意儿真坑...... 一上午除了打了几遍板子什么也没干......真是废了...... 你要加油啊...... #include<cstdio> #includ ...