蓝桥杯 第2天 基本数据结构 栈&队列&链表

目录

1.栈

2.使用栈来匹配括号

3.使用栈来匹配符号

4.用栈将十进制转为二进制

5.用栈将十进制转为任意进制

6.使用栈完成中序表达式往后序表达式转换

7.使用栈计算后序表达式的值

8.队列

列表实现队列

9.用队列玩传花游戏

10.双端队列

11.双端队列实现回文检测器

12.列表->链表

(1)node类

(2)链表的实现


1.栈

LIFO Last In First Out

用列表实现栈

class stack:
    def __init__(self):
        self.items=[]
    def isempty(self):
        return self.items==[]
    def push(self,item):
        self.items.append(item)
    def pop(self):
        self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)

2.使用栈来匹配括号

from pythonds.basic import Stack
def perchecker(symbolstring):
    s = Stack()
    balanced = True
    index = 0
    while(index<len(symbolstring) and balanced):
        symbol = symbolstring[index]
        if(symbol=='('):
            s.push(symbol)
        else:
            if s.isEmpty():
                balanced=False
            else:
                s.pop()
        index+=1
    if balanced and s.isEmpty():
        return True
    else:
        return False

3.使用栈来匹配符号

主要是要多判断一下栈顶和当前拿来匹配的右符号是否相同

from pythonds.basic import Stack
def check(string):
    s=Stack()
    index=0
    balanced=True
    while index<len(string) and balanced:
        a = string[index]
        if(a in '([{'):
            s.push(a)
        else:
            if s.isEmpty():
                balanced=False
            elif matches(s.peek(),a):
                s.pop()
            else:
                balanced=False
        index += 1
    if balanced and s.isEmpty():
        return True
    else:
        return False
    
def matches(open,close):
    ins='([{'
    out=')]}'
    if(ins.index(open)==out.index(out)):
        return True
    else:
        return False

4.用栈将十进制转为二进制

一直重复以下两步,直到这个数为0

(1)对2取余,将余数压入栈中

(2)用2整除

最后完成时,栈顶的就是最高位,栈底的事最低位,用字符串把它们缝合起来就行

from pythonds.basic import Stack
def tentotwo(x):
    s = Stack()
    while x!=0:
        res = x%2
        s.push(res)
        x//=2
    ans=''
    while not s.isEmpty():
        ans+=str(s.pop())
    return ans

5.用栈将十进制转为任意进制

from pythonds.basic import Stack
def tentotwo(x,base):
    char='0123456789ABCDEF'
    s = Stack()
    while x!=0:
        res = x%2
        s.push(res)
        x//=2
    ans=''
    while not s.isEmpty():
        ans+=char[s.pop()]
    return ans

6.使用栈完成中序表达式往后序表达式转换

这种有悖于人脑逻辑的东西。。。

强记一下步骤:用一个列表来存储结果,一个栈来完成对符号的排列,从左到右扫描中序表达式

(1)如果是‘(’,压入栈

(2)如果是')',一直出栈,知道对应的(也出栈

(3)如果是操作数,直接加入列表

(4)如果是符号,加入栈中,但是在这之前得确保栈顶符号的优先级小于它,如果大于,就加入结果列表

from pythonds.basic import Stack
import string

def change(infix):
    prec={}
    prec["*"]=3
    prec["/"]=3
    prec["+"]=2
    prec["-"]=2
    prec["("]=1
    s=Stack()
    anslist=[]
    for i in infix:
        if i=='(':
            s.push(i)
        elif i in string.ascii_uppercase :
            anslist.append(i)
        elif i==')':
            while((not s.isEmpty()) and (s.peek()!=')')):
                anslist.append(s.pop())
        else:
            while(not s.isEmpty() and prec[s.peek()]>prec[i]):
                anslist.append(s.pop())
            s.push(i)
    while(not s.isEmpty()):
        anslist.append(s.pop())
    return " ".join(anslist)

print(change("A+B*C"))

7.使用栈计算后序表达式的值

使用一个栈即可

碰到操作数就压入栈,碰到操作符就从栈里弹出两个操作数

需要注意,第一个弹出的是右操作数,第二个弹出的是左操作数

根据操作符对这两个操作数进行运算,运算结果压入栈中

最后栈中就只剩下一个值,也就是答案

from pythonds.basic import Stack
def domath(a,b,c):
    if c=='+':
        return a+b
    elif c=='-':
        return a-b
    elif c=='*':
        return a*b
    else c=='/':
        return a/b
def caculate(postfix):
    s = Stack()
    for i in postfix:
        if i in "0123456789":
            s.push(int(i))
        else:
            y=s.pop()
            x=s.pop()
            ans=domath(x,y,i)
            s.push(ans)
    return s.pop()

8.队列

FIFO First In First Out 先进先出

列表实现队列

class queue:
    def __init__(self):
        self.items=[]
    def isempty(self):
        return self.items==[]
    def enqueue(self,item):
        self.items.insert(0,item)
    def dequeue(self):
        self.items.pop()
    def size(self):
        return len(self.items)

9.用队列玩传花游戏

from pythonds.basic import Queue
def g(namelist,num):
    q = Queue()
    for i in namelist:
        q.enqueue(i)
    while(q.size()>1):
        for i in range(num):
            q.enqueue(q.dequeue())
        q.dequeue()
    return q.dequeue()

10.双端队列

使用列表实现双端队列

class deque:
    def __init__(self):
        self.items=[]
    def isempty(self):
        return self.items==[]
    def addfront(self,x):
        self.items.append(x)
    def addrear(self,x):
        self.items.insert(0,x)
    def removefront(self):
        return self.items.pop()
    def removerear(self):
        return self.items.pop(0)
    def size(self):
        return len(self.items)

11.双端队列实现回文检测器

from pythonds.basic import Deque
def palchecker(strlist):
    d = Deque()
    for i in strlist:
        d.addRear(i)
    equal=True
    while d.size()>1 and equal:
        a = d.removeRear()
        b = d.removeFront()
        if a!=b:
            equal=False
    return equal

12.列表->链表

(1)node类

class node:
    def __init__(self,x):
        self.data=x
        self.next=None
    def getdata(self):
        return self.data
    def getnext(self):
        return self.next
    def setdata(self,x):
        self.data=x
    def setnext(self,x):
        self.next=x

(2)链表的实现

class UnorderedList:
    def __init__(self):
        self.head=None
    def isempty(self):
        return self.head==None
    def add(self,item):
        temp = node(item)
        temp.setnext(self.head)
        self.head=temp
    def length(self):
        ans = 0
        current=self.head
        while current!=None:
            ans+=1
            current = current.getnext()
        return ans
    def search(self,item):
        find=False
        current=self.head
        while current!=None and not find:
            if current.getdata()==item:
                find=True
            else:
                current = current.getnext()
        return find
    def remove(self,item):
        current=self.head
        previous=None
        find=false
        while not find:
            if current.getdata==item:
                find=True
            else:
                previous=current
                current=current.getnext
        if previous==None:
            self.head=current.getnext
        else:
            previous.setnext(current.getnext)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值