python 表达式求值数据结构_python 数据结构与算法

python 数据结构与算法

1 python常见数据结构性能

1.1 List

1.1.1 安索引取值和赋值

1.1.2 列表append和__add__()

1.1.3 使用timeit模块测试执行时间

1.1.4 List基本操作的大O数量级

1.2 Dict

1.2.1 dict数据类型

2 线性结构 Linear Structure

2.1 栈Stack

2.1.1 抽象数据类型Stack

2.1.2 Stack的操作如下

2.1.3 栈的应用1:简单括号匹配

2.1.3.1 圆括号匹配

2.1.3.2 通用括号匹配

2.1.4 栈的应用2:进制转换

2.1.4.1 十进制转换二进制

2.1.4.2 十进制转换任意进制

2.1.5 栈的应用3:表达式转换

2.1.5.1 中缀表达式

2.1.5.2 全括号中缀表达式

2.1.5.3 前缀和后缀表达式

2.1.5.4 中缀表达式转换为前缀和后缀形式

2.1.5.5 通用的中缀转后缀算法

2.1.5.6 后缀表达式求值

2.2 队列Queue

1 python常见数据结构性能

1.1 List

1.1.1 安索引取值和赋值

list最常用的操作是:按索引取值和赋值(v=a[i],a[i]=v),这两个操作执行时间与列表大小无关,均为O(1)。

1.1.2 列表append和__add__()

list.addend(v),执行时间是O(1)。

list0 = list1 + [v],执行时间是O(n+k),其中k是被加的列表长度。

1.1.3 使用timeit模块测试执行时间

ef5b32c73432b420a90d52a9b7f59bfc.png

使用timeit模块对函数计时:

1d8283d45d06283e0c2bb0b06e266a84.png

56cc77b980622c37c8dca0f2be4c33d8.png

1.1.4 List基本操作的大O数量级

d34aef0ad7e1eb839fc9cc6a6c0f51fb.png

1.2 Dict

1.2.1 dict数据类型

字典是根据key找到对应的value,最常用的取值get和赋值set,其性能都是O(1)。另外一个常用的操作判断字典中是否存在某个key (in),这个性能也是O(1)。

33c7b89e422326aad888f1fea6a6b347.png

2 线性结构 Linear Structure

线性结构是一种有序数据项的集合,其中每个数据项都有唯一的前驱和后继(除了第一个和最后一个)。

2.1 栈Stack

栈是一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端,这一端叫做“栈顶top”,另一端叫做“栈底base”。

栈是一种后进先出LIFO:Last in First out,这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近。

5499d712d5d104860e3c393b108781aa.png

2.1.1 抽象数据类型Stack

抽象数据类型“栈”是一个有次序的数据集,每个数据项仅从“栈顶”一端加入到数据集中、从数据集中移除,栈具有后进先出LIFO的特性。

978b70bb8f27198243365d11db32a95e.png

2.1.2 Stack的操作如下

stack():创建一个空栈,不包含任何数据项。

push(item):将item加入栈顶,无返回值。

pop():将栈顶的数据项移除,并返回,栈被修改。

peek():“窥视”栈顶数据项,返回栈顶的数据。

isEmpty():返回是否是空栈。

size():返回栈中有多少个数据项。

85886af47ce4e11f871219fc1a2e0dcd.png

class Stack(object):

def __init__(self):

self.stack = []

def push(self, item):

self.stack.append(item)

def pop(self):

if not self.is_empty():

return self.stack.pop()

def peek(self):

if not self.is_empty():

return self.stack[self.size()-1]

def is_empty(self):

return len(self.stack) == 0

def size(self):

return len(self.stack)

2.1.3 栈的应用1:简单括号匹配

2.1.3.1 圆括号匹配

括号必须遵循“平衡”原则,即每个开括号必须有一个比括号对应。

从左到右扫描括号,最新打开的左括号,应该匹配最先遇到的右括号。这样,第一个左括号就应该匹配最后一个右括号,这种次序反转的识别,正好符合栈的特性。

9e0e91af159ffbf91880e8d2caeabcdd.png

流程图如下:

d2c9cf4259755d5bccb69c661957aff7.png

from data_structure.Stack.stack import Stack

def brackets_valid(expression):

stack = Stack()

for item in expression:

if item == "(":

stack.push(item)

elif item == ")":

if stack.is_empty():

return False

else:

stack.pop()

return stack.is_empty()

if __name__ == '__main__':

print(brackets_valid("()()()"))

print(brackets_valid("(()())(()"))

print(brackets_valid("((5+6)*(4+3))+((10-9)"))

2.1.3.2 通用括号匹配

实际应用中,会遇到更多种括号,比如:[], {},()。

5e0e2e3b03aaaf9a9660023572821b9d.png

from data_structure.Stack.stack import Stack

def brackets_valid(expression):

stack = Stack()

mapping = {

")": "(",

"]": "[",

"}": "{"

}

for item in expression:

if item in "([{":

stack.push(item)

elif item in ")]}":

if stack.is_empty():

return False

else:

if stack.peek() != mapping[item]:

return False

else:

stack.pop()

return stack.is_empty()

if __name__ == '__main__':

print(brackets_valid("()()()"))

print(brackets_valid("(()())(()"))

print(brackets_valid("((5+6)*(4+3))+((10-9)"))

print(brackets_valid("{{([][])}()}"))

print(brackets_valid("[[{{(())}}]]"))

print(brackets_valid("[][][](){}"))

print(brackets_valid("([)}"))

print(brackets_valid("((()]))"))

print(brackets_valid("[{()]"))

2.1.4 栈的应用2:进制转换

进制:指用多少字符来表示整数。十进制是0-9十个数字字符,二进制是0、1两个字符。

例如:十进制233对应的二进制是11101001,具体算法如下:

233 = 2102 + 3101 + 3100

11101001 = 127 + 126 + 125 + 024 + 123 + 022 +021 + 1*20

2.1.4.1 十进制转换二进制

常见的十进制转换二进制采用的是**“除2求余数”的算法。如下:35的二进制是100011。在除2求余的过程中,得到的余数是从低到高的次序,而输出则是从高到低,所以需要一个栈来反转次序**。

b729f7d555db4f9e1b0e6f92f56df4e1.png

from data_structure.Stack.stack import Stack

def convert(num):

if not isinstance(num, int):

return False

stack = Stack()

while num:

num, remainder = divmod(num, 2)

stack.push(remainder)

result = ""

while not stack.is_empty():

result += str(stack.pop())

return result

if __name__ == '__main__':

print(f"35的二进制数是{convert(35)}")

2.1.4.2 十进制转换任意进制

将“除2求余”改为“除N求余”就可以将上面的算法扩展为任意进制转换。

十进制233对应八进制351,十六进制是E9。

主要区别是:

二进制:0-1

十进制:0-9

八进制:0-7

十六进制:0-9,A-F

from data_structure.Stack.stack import Stack

def convert(num, unit):

if not isinstance(num, int):

return False

dights = "0123456789ABCDEF"

stack = Stack()

while num:

num, remainder = divmod(num, unit)

stack.push(remainder)

result = ""

while not stack.is_empty():

result += str(dights[stack.pop()])

return result

if __name__ == '__main__':

print(f"35的二进制数是{convert(35, 2)}")

print(f"233的八进制数是{convert(233, 8)}")

print(f"233的十六进制数是{convert(233, 16)}")

2.1.5 栈的应用3:表达式转换

2.1.5.1 中缀表达式

操作符位于两个操作数之间的表示法,称为“中缀”表达式。例如:A+B。

2.1.5.2 全括号中缀表达式

计算机处理时最好避免复杂的优先级(乘除优先于加减、括号优先级)规则,能明确规定所有的计算顺序是最好的。因此,引入全括号表达式: ((A+B*C)+D)

2.1.5.3 前缀和后缀表达式

前缀表达式:将操作符移到操作数前面,即:+AB。

后缀表达式:将操作符移到操作数后面,即:AB+。

在前缀和后缀表达式中,操作符次序完全决定了运算的次序,不再混淆。

818b8e74f76f977a54999211a6a0a7b4.png

2.1.5.4 中缀表达式转换为前缀和后缀形式

84ca5e908a047c5e7cfbf5a6ac28359f.png

2b489b12e30e42f54a49dcd10b30e636.png

3ef09a20df37ee18b1dbab3d5b1eff03.png

2.1.5.5 通用的中缀转后缀算法

中缀表达式A+BC,对应的后缀表达式是 ABC+。其中,操作数ABC的顺序没有改变,操作符的出现顺序在后缀表达式中反转了。由于*的优先级比+高,所以后缀表达式中操作符的出现顺序与运算次序一致。

1218affda1cc00cf07a9f750da66197b.png

ff1ed923701856289752bc3504e4f62b.png

0213126ccdf4c4ef1687c7af6eb744b0.png

算法流程:

d662dc1041233834ebcb72650f0a0583.png

9eb5059e2ad86d30f19bd144c142451d.png

5dd7dd9c32e49f931c8024855a25c7a3.png

import string

from data_structure.Stack.stack import Stack

def convert_postfix(expression):

result = ""

oper_stack = Stack()

priority = {

"(": 0,

"+": 1,

"-": 1,

"*": 2,

"/": 2

}

for item in expression:

if item in string.ascii_letters or item in string.digits:

result += item

elif item == "(":

oper_stack.push(item)

elif item == ")":

while oper_stack.peek() != "(":

result += oper_stack.pop()

else:

oper_stack.pop()

elif item in "+-*/":

while oper_stack.peek() and \

priority[oper_stack.peek()] >= priority[item]:

result += oper_stack.pop()

else:

oper_stack.push(item)

while not oper_stack.is_empty():

result += oper_stack.pop()

return result

if __name__ == '__main__':

print(convert_postfix("A+B*C"))

print(convert_postfix("(A+B)*C"))

2.1.5.6 后缀表达式求值

对于后缀表达式从左到右扫描,由于操作符在操作数后面,所以要暂存操作数,在遇到操作符的时候再将暂存的两个操作数进行实际的计算。

例如: ABC*+,先扫描到了ABC暂存到栈中,扫描到*的时候,从栈中弹出2个操作数做乘法,做完之后再存入栈中;继续扫描到+,从栈中弹出2个操作数做加法。

8e8dbff123a0ae8bb5eab52efeebf3c2.png

注意:对于-/操作符,弹出的两个操作数顺序很重要,先弹出的是右操作数,后弹出的是左操作数。

算法流程:

703c0f575a0eb15d7a122869aae7055e.png

import string

from data_structure.Stack.stack import Stack

from data_structure.Stack.infix_to_postfix import convert_postfix

def calculate(expression):

stack = Stack()

for item in expression:

if item in string.digits:

stack.push(item)

elif item in "+-*/":

first = stack.pop()

second = stack.pop()

stack.push(str(eval(second + item + first)))

return stack.pop()

if __name__ == '__main__':

print(calculate(convert_postfix("1+2*3")))

print(calculate(convert_postfix("(1+2)*3")))

2.2 队列Queue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3新特性罗列

接触CSS3这么久了&#xff0c;总是到要用的时候直接拿来用&#xff0c;却没有好好地总结归纳一下&#xff0c;那就在这里好好梳理一下吧。 CSS3边框&#xff1a; 圆角边框&#xff1a; 关键&#xff1a;border-radius <!DOCTYPE html> <html> <head> <…

Log4j 2:性能接近疯狂

最近&#xff0c;Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道&#xff1a; TheASF &#xff03;log4j2摇摇欲坠 &#xff01; 性能接近疯狂^^ http://t.co/04K6F4Xkaa — Mark Struberg&#xff08;struberg&#xff09; 2013年5月7日 &#xff08;来自M…

Uncaught SyntaxError: Invalid Unicode escape sequence异常处理

今天碰到一个问题&#xff0c;页面报错&#xff1a;Uncaught SyntaxError: Invalid Unicode escape sequence ,{index:operate,name:operate,label:<s:text name"com.vrv.cems.ptp.installSoft.operate"></s:text>,width:getPerWidth(0.1),formatter:fun…

26、jQuery

一. jQuery简介 (一) jQuery是什么&#xff1a; 是一个javascript代码仓库 是一个快速的简洁的javascript框架&#xff0c;可以简化查询DOM对象、处理事件、制作动画、处理Ajax交互过程。 (二) jQuery优势 体积小&#xff0c;使用灵巧(只需引入一个js文件)方便的选择页面元素(模…

玩转ajax

1.什么是ajax&#xff1f; Ajax 是 Asynchronous JavaScript and XML&#xff08;以及 DHTML 等&#xff09;的缩写。 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 JavaScript 代码是运行 Ajax 应用程序的核心代码&#xff0c;帮助改…

Spring MVC:验证器和@InitBinder

很难想象没有针对用户数据的验证逻辑的Web应用程序。 几乎所有用户的数据都有一些限制&#xff0c;例如&#xff0c;出生日期应由日&#xff0c;月&#xff0c;年等组成。SpringMVC拥有自己的数据验证解决方案&#xff0c;并且在Validator界面的帮助下可用。 Spring MVC Vali…

ADB 调试

1、adb简介 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序&#xff0c;说白了就是debug工具。adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff…

margin折叠-从子元素margin-top影响父元素引出的问题

正在做一个手机端电商项目&#xff0c;顶部导航栈的布局是一个div包含一个子div&#xff0c;如果给在正常文档流中的子div一个垂直margin-top&#xff0c;神奇的现象出现了&#xff0c;两父子元素的边距没变&#xff0c;但父div跟着一起往下走了&#xff01; html代码&#xff…

Flexible 弹性盒子模型之CSS flex-shrink 属性

实例 让第二个元素收缩到其他元素的三分之一&#xff1a; 效果预览 div:nth-of-type(2){flex-shrink:3;}浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 flex-shrink29.021.…

idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...

最近突然看到这篇几年前随手记录的文章&#xff0c;居然浏览量那么高。看来很多小伙伴也开始从 Eclipse 转到 IDEA&#xff0c;这里为了让大家更好的掌握 IDEA 的使用&#xff0c;我建议大家可以看看下面这个 IDEA 教程。首先&#xff0c;确保 IDEA 软件正确安装完成&#xff0…

如何在Maven中运行Ant目标?

maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常&#xff0c;使用maven build&#xff0c;您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin直接将此w…

PHP基本知识

php为服务端的脚本语言&#xff0c;它的使用需要打开WAMP的开发环境&#xff0c;php也可以用制作网页的DW制作&#xff0c;文件需保存在wamp文件夹内的www文件夹里面。 嵌入php代码所使用的标签&#xff1a;<?php ?>&#xff1b; 运行php条件&#xff1a; 1.电脑上需…

java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍我们以饭店为例&#xff0c;假设饭店只有三个座位&#xff0c;一开始三个座位都是空的。这时如果同时来了三个客人&#xff0c;服务员人允许他们进去用餐&#xff0c;然后对外说暂无座位。后来的客人必须在门口等待&#xff0c;直到有客人离开。这时&#xff0c;如果有…

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

题解 P2598 【[ZJOI2009]狼和羊的故事】

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&am…

前端机试面试题

一、题目要求 1、请实现“https://channel.jd.com/fashion.html”超值购部分内容。 2、使用CSS DIV实现页面布局&#xff0c;页面居中&#xff0c;文字颜色效果要求一致。40分 3、鼠标悬停时的动画效果。10分 4、“进入查看”标签与样式。10分 5、定义一个javascript数组&…

三分大法好

三分算法解决凸形或者凹形函数的极值&#xff1b; 如下图 lmid (Left Right) / 2 rmid (lmid Right) / 2; 如果lmid靠近极值点&#xff0c;则Right rmid&#xff1b; 否则(即midmid靠近极值点)&#xff0c;则Left lmid; 例题的话在我的博客相关分类中找. 转载于:https://w…

将内存消耗减少20倍

这将是另一个故事&#xff0c;与我们分享有关内存相关问题的最新经验。 该案例是从最近的客户支持案例中提取的&#xff0c;在该案例中&#xff0c;我们遇到了一个行为异常严重的应用程序&#xff0c;该应用程序因生产中的OutOfMemoryError消息而死亡。 在连接了Plumbr的情况下…

Flex 布局教程:实例篇

该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法。你会看到&#xff0c;不管是什么布局&#xff0c;Flex往往都可以几行命令搞定。 我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。 一、骰子的布局 骰子的一面&#xff0c;最多可以放置9个点。 下面…