數據結構和算法----棧

  • 棧的定義

棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。遵循後進先出,先進後出。

  • 分類

1、順序棧:用數組實現的棧  固定的大小

        2、鏈式棧:用鏈表實現的棧  支持動態擴容

三、棧的應用

1、檢測就近匹配的成對出現的符號

2、表達式求值

3、瀏覽器的前進和後退

四、代碼實現

1、檢測就近匹配的成對出現的符號

"""假設字符串只由[](){}三中括號組成"""

def pipei(data):

    lis = []

    kuohao = {"{":"}","[":"]","(":")"}

    for da in data:

        #判斷是否是左括號,如果是則入棧

        if da in kuohao.keys():

           lis.append(da)

        #如果是右括號,並與棧頂左括號對應的話則出棧

        elif da in kuohao.values():

           if lis and kuohao[lis[-1]] == da:

              lis = lis[:-1]

           else:

              return False

    if lis:

       return False

    else:

       return True

2表達式求值

"""只包含簡單的加減乘除運算 例如:((1+4)*2/3)+2,今天瞭解python列表特性時突然發現list的切片的時間複雜度爲O(k),代碼中頻繁切片不是很理想,將num[:-1]改爲num.pop()時間複雜度就變爲了O(1)。想到一個切片的好的解決辦法就是添加個頭指針,對列表中數據操作進行限制到一定數量時再對其進行切片遷移操作,會浪費些內存空間,但是均攤的時間複雜度爲O(1)"""

#encoding:utf-8

def expression(data):

    num = []

    asd = ""

    operator = []

    pro = ["*","/","(","+","-"]

    end = ["*","/"]

    for da in data:

        #print(num)

        if da in pro:

           operator.append(da)

           if da in end:

               continue

        elif da == ")" and operator:

           while operator[-1] != "(":

               asd =  operator[-1] + num[-1] +asd

               num = num[:-1]

               operator = operator[:-1]

           asd = num[-1]+asd

           operator = operator[:-1]

           num = num[:-1]

           num.append(expression(asd)[0])

        else:

           num.append(da)

        if operator:

            if operator[-1] in end:

                num = yunsuan(operator[-1],num)

                operator = operator[:-1]

    if operator:

        for oper in operator[::-1]:

            num = yunsuan(oper, num)

            operator = operator[:-1]

    return num

def yunsuan(oper,num):

            #print(oper)

            if oper == "+":

                res = str(int(num[-2]) + int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "-":

                res = str(int(num[-2]) - int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "*":

                ##print(int(num[-2]),int(num[-1]))

                res = str(int(num[-2]) * int(num[-1]))

                num = num[:-2]

                num.append(res)

            elif oper == "/":

                res = str(int(int(num[-2]) / int(num[-1])))

                num = num[:-2]

                num.append(res)

            return num

 

  1. 瀏覽器的前進和後退

將查看的網頁按先後順序入站。

然後如果這時候,你爸爸進來了。趕緊後退!點擊返回按鈕

這時候棧的操作是

將棧頂移入另一個棧,當前顯示的是淘寶頁面!然後你爸爸問你晚飯吃什麼之後又出去了!想要前進到剛纔的頁面。點擊它

                   

          當前展示的頁面就是你不想給你爸爸看到的頁面!

代碼是自己編的,都能實現功能。如果發現問題或有更優化的代碼請評論!!!

本文由博主學習總結而來,如果有錯誤的地方請指正。有多處借鑑!借鑑於

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect

https://time.geekbang.org/column/article/40961

萬分感謝馬老師和王爭大佬的知識分享!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章