2. 佇列
3. 棧與佇列的應用
通常,棧可定義為只允許在表的末端進行插入和刪除的線性表。後進先出(lifo)
棧的基本操作
解答演算法題時,若題幹未做出限制,則可直接使用這些基本的操作函式。
p60-p62
利用棧底位置相對不變的特性,可讓兩個順序棧共享乙個一維資料空間,將兩個棧的棧底分別設定在共享空間的兩端,兩個棧頂向共享空間的中間延伸。
共享棧是為了更有效地利用儲存空間,兩個棧的空間互相調節,只有在整個儲存空間被佔滿時才發生上溢。其訪問資料的時間複雜度均為o(1
)o(1)
o(1)
,所以對訪問效率沒有什麼影響。
佇列是另一種限定訪問位置的線性表,它只允許在表的一端插入,在另一端刪除,允許插入的一端叫做隊尾(rear),允許刪除的一端叫做隊頭(front)。先進先出(fifo)。
佇列常見基本操作
initqueue
(&q)
;//初始化佇列
queueempty
(q);
//判斷佇列是否為空
enqueue
(&q, x)
;//入隊
dequeue
(&q,
&x);
//出隊
gethead
(q,&x)
;//讀隊頭元素
迴圈佇列操作
判斷隊空隊滿
用(rear+1)%maxsize==front 來判斷是否隊已滿,即讓rear指到front前乙個位置就認為隊已滿。所以在隊滿情形實際空了乙個元素位置。如果不留這個空位,導致rea
r==f
ront
rear==front
rear==
fron
t就會混淆隊空隊滿條件。所以,在迴圈佇列中,最多只能存放maxsize-1個元素。
佇列的隊頭指標指向單鏈表的第乙個結點,隊尾指標指向單鏈表的最後乙個結點。
用單鏈表表示的鏈式佇列特別適合於資料元素變動比較大的情形,而且不存在佇列產生溢位的情況。
雙端佇列可以在佇列的兩端進行插入和刪除。有的可能有限制,比如限制輸入(一端輸入,兩端輸出)或限制輸出(一端輸出,兩端輸入)
演算法思想如下:
初始設定乙個空棧,順序讀入括號。
若是右括號,則或者使置於棧頂的最急迫期待得以消解,或者是不合法情況(括號序列不匹配,退出程式)。
若是左括號,則作為乙個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性降了一級。演算法結束時,棧為空,否則括號序列不匹配。
任何乙個表示式都是由運算元(亦稱運算物件)、操作符(亦稱運算子)和分界符組成。通常,算術表示式有三種表示:
由於中綴表示有操作符的優先順序問題,還有可加括號改變運算順序的問題,所以對於編譯程式來說,一般不使用中綴表示處理表示式,因為用字尾表示計算表示式的值只用乙個棧,而字首中綴兩個棧,所以編譯程式一般使用字尾表示求解表示式的值。
利用棧將中綴轉換成字尾
演算法見p99
該轉換演算法對輸入表示式只進行一次自左向右的掃瞄,對每個運算元只執行一次輸出,其執行時間為o(1
)o(1)
o(1)
,對每個操作符,執行進棧和退棧各一次,其時間也為o(1
)o(1)
o(1)
。若表示式中符號的總數為n,則總的執行時間複雜度為o(n
)o(n)
o(n)
。
Chapter 3 棧和佇列
一 棧和佇列的基本概念 棧的基本概念 只能在一端進行插入或刪除的線性表。進行插入或刪除操作的一端稱為棧頂,另一端為棧底,棧底是固定不變的。棧的特點 filo 先進後出 棧的儲存結構 順序棧和鏈式棧 和線性表類似 棧的數學性質 當n個元素以某種順序如棧,並在入棧的過程中可以隨時出棧時,最終在所有元素經...
Chapter 3 軟體過程結構
由圖可以看出,每個框架活動由一系列軟體工程動作構成 每個軟體工程動作由任務集來定義,這個任務集明確了將要完成的工作任務 將要產生的工作產品 所需要的質量保證點,以及用於表明過程狀態的里程碑。過程模式 process pattern 描述了軟體工程工作中遇到的過程相關的問題,明確了問題環境並給出了針對...
Chapter 3 決策樹學習
決策樹學習是一種逼近離散值目標函式的方法,對雜訊資料有很好的魯棒性且能夠學習析取表示式。在這種方法中學習到的函式被表示為一棵決策樹,它最合適具有以下特徵的問題 主要思想 通過自頂向下構造決策樹來進行學習。使用統計測試來確定每乙個例項屬性單獨分類訓練樣例的能力,分類能力最好的屬性選作樹的根節點的測試。...