首頁 > 後端開發 > Python教學 > Python資料結構-堆疊、佇列的實作(一)

Python資料結構-堆疊、佇列的實作(一)

黄舟
發布: 2016-12-17 15:20:14
原創
2620 人瀏覽過

1. 棧

棧(Stack)是限制插入和刪除操作只能在一個位置進行的表,該位置是表的末端,稱為棧的頂(top)。堆疊的基本操作有PUSH(入棧)和POP(出棧)。堆疊又稱為LIFO(後入先出)表。

1.1 堆疊的實作

class Stack(object):
    def __init__(self):
        self.stack=[]
    def isEmpty(self):
        return self.stack==[]
    def push(self,item):
        self.stack.append(item)
    def pop(self):
        if self.isEmpty():
            raise IndexError,'pop from empty stack'
        return self.stack.pop()
    def peek(self):
        return self.stack[-1]
    def size(self):
        return len(self.stack)
登入後複製

1.2 堆疊應用

1.2.1 檢查程式中成對的符號

程式的語法錯誤經常是由缺少一個符號造成的。可用堆疊來檢查符號是否成對。做一個空棧,如果字元是開放符號('({[')則將其push棧中。如果符號是個閉合符號(')]}'),則當棧空時報錯,對應'()}'的錯誤。否則,將堆疊pop,如果彈出的符號不是對應的開放符號,則報錯,對應'(}'的錯誤。文件末尾,如果棧為空,則報錯,對應'({}'的錯誤。

def match(i,j):
    opens='([{'
    closes=')]}'
    return opens.index(i)==closes.index(j)
def syntaxChecker(string):
    stack=Stack()
    balanced=True
    for i in string:
        if i in '([{':
            stack.push(i)
        elif i in ')]}':
            if stack.isEmpty():
                balanced=False
                break
            else:
                j=stack.pop()
                if not match(j,i):
                    balanced=False
                    break
    if not stack.isEmpty():
        balanced=False
    return balanced
登入後複製

1.2.2 進制轉換

十進制轉換二進制:把十進制轉成二進制一直分解至商數為0。 Solving with Algorithms and Data Structures》的圖片:

Python資料結構-堆疊、佇列的實作(一)碼:

def decimal_to_bin(dec):
    stack=Stack()
    cur=dec
    while cur>0:
        a=cur%2
        cur=cur/2
        stack.push(a)
    binstr=''
    while not stack.isEmpty():
        binstr+=str(stack.pop())
    return binstr
登入後複製


1.2.3  後綴記法

符時就作用於從棧彈出的兩個元素,將結果彈入棧中。

(7+8)/(3+2)可以寫7 8 + 3 2 + /

來自《Problem Solving with Algorithms and Data Structures》的圖片:

中綴到後綴到的轉換:當讀到一個操作數的時候,放到輸出。讀到運算元(+,-,*,/)時,如果堆疊為空,則壓入堆疊中,否則彈出堆疊元素放到輸出中直到發現優先權較低的元素為止。讀到'(',壓入棧中,讀到')',彈出棧元素並發到輸出中直到發現'('為止。在末尾,將棧元素彈出直到該棧變成空棧。Python資料結構-堆疊、佇列的實作(一)

來自《 Problem Solving with Algorithms and Data Structures》的圖片:

def infixtoPostfix(infix):
    a={}
    a['*']=3
    a['/']=3
    a['+']=2
    a['-']=2
    a['(']=1
    stack=Stack()
    post=''
    for i in infix:
        if i not in a and i!=')':
            post+=i
        elif i=='(':
            stack.push(i)
        elif i==')':
            top=stack.pop()
            while top!='(':
                post+=top
                top=stack.pop()
        else:          
            while not stack.isEmpty() and a[i]<=a[stack.peek()]:
                post+=stack.pop()
            stack.push(i)
    while not stack.isEmpty():
        post+=stack.pop()
    return post
                   
def postfixExp(postfix):
    stack=Stack()
    postlist=postfix.split()
    for i in postlist:
        if i not in &#39;+-*/&#39;:
            stack.push(i)
        else:
            a=stack.pop()
            b=stack.pop()
            result=math(i,b,a)
            stack.push(result)
    return stack.pop()
def math(x,y,z):
    if x==&#39;+&#39;:
        return float(y)+float(z)
    if x==&#39;-&#39;:
        return float(y)-float(z)
    if x==&#39;*&#39;:
        return float(y)*float(z)
    if x==&#39;/&#39;:
        return float(y)/float(z)
登入後複製

2 隊列Python資料結構-堆疊、佇列的實作(一)

隊列(queue)也是表,使用隊列時插入和刪除在不同的端進行。 ,在表格的末端(rear)插入一個元素,還有出列(Dequeue),刪除表格開頭的元素。文章請關注PHP中文網(www.php.cn)!
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板