栈(堆栈):是一种可存入数据、访问、删除等元素的容器
特点:后进先出
#栈实现:线性表、链表
例:
class NullStackError(BaseException): #自定义空栈异常
def init(self):
super().init("null stack error ")
class MyStack():
def init(self,len=0,list=None):
self.__len = 0
self.__list = list
def push(self,data):
self.__list.append(data)
self.__len += 1
def pop(self):
temp = None
if self.__len == 0:
raise NullStackError()
else:
temp = self.__list.pop()
self.__len -= 1
return temp
def peek(self):
if self.__len == 0:
raise NullStackError()
else:
return self.__list[-1]
def length(self):
return self.__len()
#栈的应用:表达式的表示,运算,变换
中缀表达式:运算符写在两个运算对象之间(最常用)
前缀表达式:所有运算符写在运算对象之前
后缀表达式:所有运算符写在运算对象之后(更便于计算机处理)
前缀和后缀表达式不需要引进括号,或者优先级,结合性的规定
1.中缀表达式转后缀表达式
1)遇到操作数直接拼到字符串
2)遇到不同的运算符,要讨论优先级,出入栈
a,遇到"("
b,遇到")"
c,遇到"+","-"
d,遇到"","/"
2.计算后缀表达式
例:10以内后缀表达式计算
def middle2after(s = “”):
rule ={"-":1,"+":1,"":2,"/":2}
str = “”
list = []
for item in s:
if item.isalnum():
str += item
else:
if item == "(":
list.append(item)
elif item == ")":
while list[-1] != "(":
str += list.pop()
list.pop()
elif item == "+-":
if len(list) == 0:
list.append(item)
else:
while len(list) != 0 and list[-1] != "(":
str += list.pop()
list.append(item)
elif item == "*/":
list.append(item)
else:
print("表达式有问题")
while len(list) != 0:
str += list.pop()
return str
队列:与堆栈概念类似,但从一端插入元素,从另一端删除元素
堆栈&队列共同点:只允许在端点处插入或删除
#普通队列
class myQuene(object):
def init(self,list=[]):
self.__list = list
def size(self):
return len(self.__list)
def delete(self):
if self.size() == 0:
print("空队列不能删除")
else:
temp_delete = self.__list[0]
del self.__list[0]
return temp_delete
def insert(self,data):
self.__list.append(data)
def peek(self):
if self.size() == 0:
print("空队列不能查看")
else:
return self.__list[0] #返回队头元素
a = []
del a[0]
‘’’
#优先级队列
‘’’
class myQueue(object):
def init(self,list=[]):
self.__list = list
def size(self):
return len(self.__list)
def delete(self):
if self.size() == 0:
print("空队列不能删除")
else:
temp_delete = self.__list[0]
del self.__list[0]
return temp_delete
def insert(self,data):
if self.size() == 0:
self.__list.append(data) #若队列为空,将数据直接插入
else:
temp = -1
for i in range(len(self.__list)):
if self.__list[i] > data:
temp = i
break
if temp == -1:
self.__list.append(data)
else:
self.__list.insert(temp,data)
def peek(self):
if self.size() == 0:
print("空队列不能查看")
else:
return self.__list[0] #返回队头元素
q = myQueue()
q.insert(1)
q.insert(2)
q.insert(4)
q.insert(3)
print(q.delete())
print(q.delete())
print(q.delete())
print(q.delete())
#循环队列
class xunhuan():
def init(self,list = [],first = None,last =None):
self.__list = list
self.__last = last
self.__first = first
def size(self):
length = 0
if self.__last > self.__first:
length = self.__last - self.__first + 1
elif self.__last == self.__first:
length = 1
else:
length = len(self.__list) - (self.__first - self.__last -1)
return length
def insert(self,data):
if self.size() == 0:
self.__list.append(data)
self.__first = 0
self.__last = 0
else:
if self.size() == len(self.__list):
self.__list.insert(self.__last + 1,data)
else:
if self.__last + 1 == len(self.__list):
self.__list[0] = data
else:
self.__list[self.__last + 1] = data
self.__last = self.__last + 1
def delete(self):
if self.size() == 0:
print("空队列,无法删除")
elif self.size() == 1:
temp = self.__first
self.__first = None
self.__last = None
return temp
else:
if self.first + 1 == len(self.__last):
self.__first = 0
else:
if self.__first + 1 == len(self.__list):
self.__first = 0
else:
self.__first = self.__first + 1
return temp
def peek(self):
if self.size() == 0:
print("空队列")
else:
return self.__list[self.__first]
def cal(s=""):
stack = []
for item in s:
if item.isalnum():
stack.append(item)
else:
if item == “-”:
a = int(stack.pop())
b = int(stack.pop())
if item =="+":
c = b + a
elif item == "+":
c = b - a
elif item == "*":
c = b * a
elif item =="/":
c = b / a
else:
str = middle2after(“1+3*(4+2)/5+(6+7*8+6-9)”)
print(str)