用python创作计算器函数简单处理字符串形式的表达式

既然要对一个表达式进行计算,肯定要涉及对字符串的处理,和对一些数据的保存。所在我的思路里,我对数据做了一个简单的分类。不管这个表达式有多么复杂,只要不超出我们四则运算的范围我们就吧当前表达式分割出来的数据分成两类,一类是数据类,一类是符号类,将他们分别存储在两个线性结构中,在后期对他们进行有关联的处理

  1. 双栈
    数据栈
    比如表达式"1+2+3="分割出来的数据栈如下图:
    在这里插入图片描述
    符栈
    同样的表达式"1+2+3=“提取出符号的结果如下:
    在这里插入图片描述
    一个四则运算的表达式经过分割后整个式子以两个栈的形式存在,这个讲一个表达式分割为两个栈的过程叫做"生成双栈

这是我代码中生成双栈的过程

def calculator(exp)#计算器函数传入表达式(exp)
	numlist=list()#数据栈
	signlist=list()#符号栈
	num=""#数字**胶囊**
	for i in exp:#遍历这个表达式
		if num !=""#如果当前数据叫胶囊不为空
			if i not in "+-*/()":#如果当前字符不是符号则当前字符压入胶囊
				num+=i
			else:#如果当前字符属于符号则进行一下处理
				numlist.append(float(num))#将数据胶囊压入数据栈
				#因为一旦当前是符号就代表遍历完了一个数字转为float压入数据栈
				signlist.append(i)#讲当前符号压入符栈
				num#胶囊执行**推新**

其中提到了两个概念胶囊推新
胶囊:
胶囊是我自己设计的一种编程名词,当我们需要短暂累计保存一些数据时,通常需要一个变量对其进行保存,变量为胶囊盒子,这个变量里的元素所组成的顺序整体就被我称为胶囊,同循环胶囊共同性质分为修改型累积型,在累计型中胶囊多为线性结构。
胶囊
胶囊产生后推新就应运而生,推新通常与胶囊绑在一块,当每次我们生成胶囊,并将其压入该压入的地方,若为累积型,每次则需要将胶囊盒 子清空,以积累新的数据,这个清空胶囊盒子的动作便称为推新
如此方法可以将任意一个四则运算表达式的符号与数据分割出来,就可以通过找到其中的一些关联的进行联动处理

  1. 联动处理
    联动实施的必要条件是所需处理的多个元素之间有所关联,所以我们先要找到联动元素之间的关联,比如连个栈它们是由一个表达式所分割所生成的,我们通过观察,数据栈和符栈长度一样,比对原表达式我们可以发现数据栈相邻的两个元素的介符总对应符栈中的一个符号,并且这个符号的下标就是那两个元素中第一个元素在数据栈的下标
    用python创作计算器函数简单处理字符串形式的表达式_第1张图片

介符与相随数
介符与相随数的概念是表达数据在表达式之间的关系,如下图
用python创作计算器函数简单处理字符串形式的表达式_第2张图片
3. 无优先级计算
在我们了解了双栈的联动处理之后,我们了解了双栈的一些关联,比如一个四则运算表达式生成的双栈,每两个在数据栈上相邻的元素的介符所在符栈所对应的下标就是那两个元素第一个的下标,我们可以通过遍历双栈中的任意一栈来完成计算,这样说太过抽象,至于如何计算,接下来就说一下怎么利用双栈对表达式进行计算
利用无优先级表达式所生成的双栈对该表达式进行简单计算
用python创作计算器函数简单处理字符串形式的表达式_第3张图片
分割计算组
用python创作计算器函数简单处理字符串形式的表达式_第4张图片
若以i作为下标遍历符栈,则符栈下标i的元素为数据栈i和i+1下标元素的运算符。上图就是我们的数据之间的关联,只要通过这种方法对应符号与数据,就可以为这些数据进行运算,每三个这样的数据就组成一个计算组

用python创作计算器函数简单处理字符串形式的表达式_第5张图片
比如上图,我们就分割出了四个计算组,在符栈中的,在无小括号四则运算中有效运算符有"+—*/",在一其符栈中有几个有效运算符,就可以分出几组计算组,在无优先级的情况下,这些的计算组不必顺序运算,先算哪个结果都是一样的,由于我们通常是遍历符栈所以我们通常是顺序计算:
用python创作计算器函数简单处理字符串形式的表达式_第6张图片
将第一个计算组中的符号作为判断,两个数据做怎样的运算,然后相互运算结果赋值给计算组第一个数据所在的位置,符号用过后在符栈中剔除用过的符号,符号消失了当然后面的符号就要向前移了。数据栈完成赋值后,两个数据都没有意义了,第一个剔除放入计算结果,第二个剔除让后面的元素都向前移动
结果入下图:
用python创作计算器函数简单处理字符串形式的表达式_第7张图片
此时如果运算成功,则下标索引往回退一个,继续从下标0开始遍历
第二次:
用python创作计算器函数简单处理字符串形式的表达式_第8张图片
用python创作计算器函数简单处理字符串形式的表达式_第9张图片
第三次:
用python创作计算器函数简单处理字符串形式的表达式_第10张图片
用python创作计算器函数简单处理字符串形式的表达式_第11张图片
第四次:
用python创作计算器函数简单处理字符串形式的表达式_第12张图片
用python创作计算器函数简单处理字符串形式的表达式_第13张图片
通过四次的计算,每一次计算都有两个数据经过运算产生新的数据放入原先第一个数据的位置,并且让后面的数据先前,这个过程叫做数据沉淀,经过一轮沉淀,表达式的计算结果会沉淀到数据栈的第一个位置即"数据栈[0]"

你可能感兴趣的:(个人制作)