从零开始——Python学习笔记(栈,队列)

栈(堆栈):是一种可存入数据、访问、删除等元素的容器
特点:后进先出
#栈实现:线性表、链表
例:
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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值