1. 两种高性能创建列表方法
1)列表解析式:l=[i for i in range(100)]
2)列表构造器:l=list(range(100))---性能最优
2. python实现栈
假设列表的尾部是栈的顶端
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
if __name__=="__main__":
s=Stack()#创建对象
print(s.isEmpty())
s.push('python')
s.push('c++')
print(s.peek())
print(s.size())
s.pop()
print(s.peek())
3. 括号匹配
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def parChecker(string):#传入括号字符串
s=Stack()
label=True#用于符号标记,当栈空且判断为右括号时---停止
index=0
while index<len(string) and label:#对传入字符串进行遍历
item=string[index]#获取每个元素
if item=='(':#左括号入栈
s.push(item)
else:
if s.isEmpty()==True:#栈空
label=False
else:#右括号且栈非空---出栈
s.pop()
index+=1
if label and s.isEmpty():
return True
else:
return False
if __name__=="__main__":
s=input('please input:')
if parChecker(s):
print(s,'匹配')
else:
print(s,'不匹配')
4. 符号匹配
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def parChecker(string):#传入括号字符串
s=Stack()
label=True#用于符号标记,当栈空且判断为右括号时---停止
index=0
while index<len(string) and label:#对传入字符串进行遍历
item=string[index]#获取每个元素
if item in "([{":#入栈
s.push(item)
else:
if s.isEmpty()==True:#栈空
label=False
else:#右括号且栈非空---出栈
s1=s.pop()#栈顶元素
if not matches(s1,item):
label=False
index+=1
if label and s.isEmpty():
return True
else:
return False
def matches(s1,s2):#用于判断是否对应
string1="([{"
string2=")]}"
return string1.index(s1)==string2.index(s2)
if __name__=="__main__":
s=input('please input:')
if parChecker(s):
print(s,'匹配')
else:
print(s,'不匹配')
5. 十进制转二进制—十进制转任意进制
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def divideBy2(num):
s=Stack()
while num>0:
re=num%2#不断取余2,并入栈
s.push(re)
num=num//2
#开始出栈并创建二进制字符串
string=""
while not s.isEmpty():
string+=str(s.pop())
return string
def baseConverter(num,base):
label="0123456789ABCDEF"
s=Stack()
while num>0:
re=num%base#不断取余基块
s.push(re)
num=num//base
#出栈
string=""
while not s.isEmpty():
string+=label[s.pop()]
return string
if __name__=='__main__':
num1=int(input("please input number:"))
print(str(num1),"对应的二进制是:",divideBy2(num1))
base=2
print(str(num1)+"对应的"+str(base)+"进制是:", baseConverter(num1,base))
base = 8
print(str(num1) + "对应的" + str(base) + "进制是:", baseConverter(num1, base))
base = 16
print(str(num1) + "对应的" + str(base) + "进制是:", baseConverter(num1, base))
6. 中序到后序的通用转换方法
前序、后序表达式不需要括号;因为运算符对应的操作数是明确的—运算顺序完全由运算符的位置决定的;
中序是最不理想的算式表达式;
转换方式----先写成完全括号表达式,然后将括号内的运算符移到左括号(前序表达式)或者右括号(后序表达式);
# 1)保存运算符的空栈---保存结果的空列表
# 2)扫描中序表达式列表
# IF 操作数 添加到结果列表
# IF 左括号 入栈
# IF 右括号 反复出栈-直到移除对应的左括号-出栈的每个运算符添加到结果列表末尾
# IF 运算符 入栈-之前需取出优先级更高或相同的运算符-添至结果列表末尾
# 3)扫描结束后-将栈中的运算符全部添加到结果列表末尾
import string
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def intopost(instr):#传参是中序表达式
prec={}#字典保存运算符的优先级
prec["("] = 1#左括号优先级最小,任何与之比较的都会压入栈
prec["+"] = 2
prec["-"] = 2
prec["*"] = 3
prec["/"] = 3
s=Stack()#栈
result=[]#结果列表
instrList=instr.split()
#开始遍历中序表达式列表
for item in instrList:
#如果是操作数--添加到结果列表
if item in string.ascii_uppercase:#包含所有大写字母的字符串
result.append(item)
#如果为左括号--入栈
elif item=='(':
s.push(item)
#如果为右括号--不断出栈直到左括号--添加到结果列表
elif item==')':
top_item=s.pop()
while top_item!='(':
result.append(top_item)
top_item=s.pop()
#如果为操作符--入栈前先取出优先级更高或相同的运算符-添至结果列表末尾
else:
while (not s.isEmpty()) and (prec[s.peek()]>=prec[item]):
result.append(s.pop())
s.push(item)
#扫描结束后,将栈中所有元素添加到结果列表末尾
while not s.isEmpty():
result.append(s.pop())
#返回结果列表创建的字符串
return " ".join(result)
if __name__=='__main__':
s=input('please input In-order expression:')
print(s+"对应的后序表达式为:"+intopost(s))
7. 计算后序表达式
扫描后序表达式—操作数入栈—遇到运算符则选择离它最近的两个操作数计算;
做除法的时候—注意—后序表达式只改变运算符的位置,操作数的位置与在中序表达式中的位置相同;
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self,item):#进栈不用返回值
self.items.append(item)
def pop(self):#出栈-返回出去的值
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def compu(op,num1,num2):#传参分别是操作符、操作数1、操作数2
if op=='+':
return num1+num2
elif op=='-':
return num1-num2
elif op=='*':
return num1*num2
else:
return num1/num2
def compu_post(poststr):
s=Stack()#栈存放操作数
poststrList=poststr.split()
#开始遍历后序表达式
for item in poststrList:
#如果是操作数--入栈
if item in "0123456789":
s.push(int(item))
#如果是操作符--两次出栈--计算后入栈
else:
n2=s.pop()
n1=s.pop()
s.push(compu(item,n1,n2))
#最后栈中剩的元素就是结果
return s.pop()
if __name__=='__main__':
s=input("please input Post-order expression:")
print(s+"对应的结果为:"+str(compu_post(s)))