日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理论基础 —— 栈

發布時間:2025/3/17 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理论基础 —— 栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

棧(Stack)是一種特殊的線性表,只能在某一端插入和刪除的特殊線性表。它按照后進先出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂。

由于棧滿足先進后出,后進先出的性質,因此也被稱為先進后出表(FILO)或后進先出表(LIFO)

當棧中元素個數為零時稱為空棧

【棧的邏輯結構】

棧的棧底固定,棧頂浮動,允許進行插入和刪除操作的一端稱為棧頂(Top),另一端為棧底(Bottom),插入一個元素稱為進棧(Push),刪除一個棧頂元素稱為出棧(Pop)。

無論是順序棧還是鏈棧,其出棧、入棧的時間復雜度均為 O(1)

當棧滿時再插入元素,將發生上溢,當棧為空時刪除元素,將發生下溢。


【棧的順序存儲結構】

1.順序棧

棧的順序存儲結構即順序棧,其使用數組來模擬棧,并設置一個棧頂指針 top,選用 a[0] 作為棧底,a[top] 作為棧頂

其元素個數存在限制,并且可能造成空間浪費。

2.雙端棧

在一個程序中有時需要同時使用具有相同數據類型的兩個棧,當為他們開辟相同的存儲空間后,某一時刻一個棧已經滿了,而另一個棧還有很大的空間,這樣會造成存儲空間的浪費,此時可以令兩棧共享空間,即使用雙端棧

使用一個數組來存儲兩個棧,讓一個棧的棧底為該數組的始端(a[0]),另一個棧的棧底為該數組的末端(a[n-1]),兩個棧從各自的端點向中間延伸(top1++,top2--)

由于雙端棧的特性,因此其一般是用于具有兩棧空間需求存在相反情況時,即一個棧增長,另一個棧縮短的情況。

【棧的邏輯存儲結構】

棧的邏輯存儲結構即鏈棧,其將鏈表的頭指針作為棧頂,便于插入、刪除操作。

由于其空間是動態擴展的,因此一般不存在上溢的問題,只有當內存沒有可用空間時才會出現棧滿,但每個元素都需要一個指針域,從而產生了結構性開銷。

【實現】

  • 順序棧:點擊這里
  • 雙端棧:點擊這里
  • 鏈棧:點擊這里
  • 【應用】

    1.中綴表達式

    中綴表達式:運算符在兩個運算對象中間,基本運算符有 +、-、*、/、()、# 等,其中 # 為中綴表達式的界定符

    例如:#3*(4+2)/2-5# 就是一個中綴表達式

    在進行運算時,要考慮運算符的優先級與結合性,常見運算符優先級表如下:

    中綴表達式的求值過程用到兩個棧:運算對象棧 Opnd、運算符棧 Optr,算法偽代碼如下:

  • Opnd 初始化為空,Optr 初始化為表達式的界定符 #
  • 從左到右掃描表達式的每一個字符
    1)若當前字符是操作數:入棧 Opnd
    2)若當前字符是運算符
    ? ①當前運算符優先級 > 棧 Optr 的棧頂運算符優先級:入棧 Optr,處理下一字符
    ? ②當前運算符優先級 <?棧 Optr 的棧頂運算符優先級:棧 Opnd 出棧兩個操作數,棧 Optr 出棧一個運算符,進行運算后將結果入棧 Opnd,處理當前字符
    ? ③當前運算符優先級 = 棧 Optr 的棧頂運算符優先級:棧 Optr 棧頂元素出棧,處理下一字符
  • 當棧 Optr 為空時,輸出棧 Opnd 棧頂元素,即為表達式運算結果
  • 以下圖為例:

    2.中綴表達式轉后綴表達式

    后綴表達式:所有的計算按照運算符出現的順序從左向右進行,不用考慮運算符的優先級

    例如:中綴表達式 3*(4+2)/2-5 對應后綴表達式 3 4 2 + * 2 / 5 -

    為了處理方便,常將中綴表達式轉為等價的后綴表達式,在轉換過程中用到一個棧 S,算法偽代碼如下:

  • 初始化棧 S
  • 從左到右依次掃描中綴表達式的每一個字符
    1)若當前字符是操作數:輸出該字符,處理下一字符
    2)若當前字符是運算符:
    ? ①當前運算符優先級 > 棧?S 棧頂運算符優先級:該運算符入棧 S,處理下一字符
    ? ②當前運算符優先級 <?棧?S 棧頂運算符優先級:棧 S 棧頂運算符彈出并輸出,處理當前字符
    ? ③當前運算符優先級 =?棧?S 棧頂運算符優先級:棧 S 棧頂運算符彈出,處理向下一字符
  • 3.后綴表達式求值

    后綴表達式的求值過程中用到一個棧 S,算法偽代碼如下:

  • 初始化棧 S
  • 從左到右依次掃描表達式的每一個字符
    1)若當前字符是操作數:入棧 S,處理下一個字符
    2)若當前字符是運算符:棧 S 出棧兩個操作數,進行運算并將執行結果入棧 S,處理下一個字符
  • 當表達式的所有字符都處理完成,輸出棧頂元素,即為表達式運算結果
  • 以下圖為例:

    ?

    ?

    總結

    以上是生活随笔為你收集整理的理论基础 —— 栈的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。