python代码——栈和队列的应用

python代码——栈和队列的应用

1.栈的应用

# 定义结点类,包含两个成员:结点元素值和指向下一结点的指针
class SingleNode():
    # 结点类初始化
    def __init__(self, item):
        self.item = item  # item存放结点的数值
        self.next = None # 下一指针指向
# 定义链栈
class LinkStack():
    #初始化
    def __init__(self):
        self.top=None
    #判断是否为空
    def is_empty(self):
        if self.top==None:
            return True
        else:
            return False
    #返回栈顶元素
    def get_element(self):
        if self.is_empty():
            return None
        else:
            return self.top.item
    #返回栈长度
    def get_length(self):
        tmp=self.top
        if tmp==None:
            return 0
        i=0
        while tmp != None:
            tmp=tmp.next
            i+=1
        return i    
    # 进栈
    def add_stack(self, element):
        node = SingleNode(element)
        node.next = self.top # 指针变换
        self.top = node
    # 出栈
    def remove_stack(self):
        if self.is_empty():
            raise IndexError("栈已空,无法出栈")
        else:
            node=self.top
            self.top=self.top.next
            return node.item
    #清空栈
    def clear_stack(self):
        self.top=None       

括号匹配:

def match_brac(s):
    in_stack_dic={'{':1,'[':2,'(':3}
    out_stack_dic={'}':1,']':2,')':3}    
    test=LinkStack()
    s=str(s)
    for i in s:
        if i in in_stack_dic:
            test.add_stack(in_stack_dic[i])
        elif i in out_stack_dic:
            try:
                out=test.remove_stack()
            except IndexError:
                print('匹配失败')
                return 
            if out!=out_stack_dic[i]:
                print('匹配失败')
                return 
    print('匹配成功')
    return 

十进制转二进制:

def dec2bin(i):
    i=int(i)
    test=LinkStack()
    r=[]
    while i >0:
        test.add_stack(i%2)
        i=i//2
    tmp=test.top
    while tmp!=None:
        tmp=tmp.next
        r.append(str(test.remove_stack()))
    return ''.join(r)

十进制转N进制:

def dec_conv(i,n):
    i=int(i)
    n=int(n)
    test=LinkStack()
    r=[]
    while i >0:
        test.add_stack(i%n)
        i=i//n
    tmp=test.top
    while tmp!=None:
        tmp=tmp.next
        r.append(str(test.remove_stack()))
    return ''.join(r)

2.队列的应用

回文检验

class DoubleQueue():
    # 结点类初始化
    def __init__(self,item):
        self.item = item 
        self.next = None

# 定义双端队列
class DoubleLinkQueue():
    # 链式队列初始化
    def __init__(self):
        self.head = None  #头指针
        self.rear = None  #尾指针
        self.top = 0      #队列长度
    
    # 判断队列是否为空
    def is_empty(self):
        return self.top == 0

    # 输出队列长度
    def get_length(self):
        return self.top

    # 返回队头元素
    def queuetop(self):
        if self.is_empty():
            return '队列为空'
        else:
            return self.head.item
    
    #返回队尾元素
    def queuerear(self):
        if self.is_empty():
            return '队列为空'
        else:
            return self.rear.item

    #头进
    def add_first(self,newItem):
        elem = DoubleQueue(newItem)
        if self.top == 0:
            self.head = elem
            self.rear = elem
        else:
            elem.next = self.head
            self.head = elem
        self.top += 1

    # 尾进
    def add_last(self,newItem):
        elem = DoubleQueue(newItem)
        if self.top == 0:
            self.head = elem
            self.rear = elem
        else:
            self.rear.next = elem
            self.rear = elem
        self.top += 1

    # 头出
    def remove_first(self):
        if self.top == 0:
            return '队列为空'
        elif self.top == 1:
            self.head = None
            self.rear = None
            self.top = 0
        else:
            self.head = self.head.next
            self.top -= 1

    #尾出
    def remove_last(self):
        if self.top == 0:
            return '队列为空'
        elif self.top == 1:
            self.head = None
            self.rear = None
            self.top = 0
        else:
            cur = self.head
            while cur.next != self.rear:
                cur = cur.next
            self.rear = cur
            self.rear.next = None
            self.top -= 1

    #遍历队列
    def travel(self):
        queuelist = []
        if self.top == 0:
            return '空'
        cur = self.head
        while cur != None:
            queuelist.append(cur.item)
            cur = cur.next
        return queuelist

    # 清空链表
    def clear(self):
        self.head = None
        self.rear = None
        self.top = 0
def pali_det(s):
    s=str(s)
    test=DLinkQueue()
    for i in s:
        test.add_queue_top(i)
    while test.get_length()>1:
        if test.remove_queue_top()!=test.remove_queue_rear():
            print('不是回文词')
            return 
    print('是回文词')
    return

 

posted @ 2022-04-25 14:55  hungry_J  阅读(13)  评论(0)    收藏  举报