Python注意说明一(栈)

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)))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LH-Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值