資料結構中的棧和佇列和串

2021-10-07 17:20:48 字數 3964 閱讀 2922

棧的定義

棧是只能在表的一端進行插入、刪除的線性表。棧中允許插入、刪除的一端稱為棧頂相反,棧中不允許插入、刪除的一端稱為棧底。處於棧頂位置的資料元素稱為棧頂元素不含任何資料元素的棧稱為空棧。棧的特點為後進先出(last in first out,lifo)。下圖為乙個棧的示意圖,通常用指標top指示棧頂的位置,用指標bottom指向棧底。棧頂指標top動態反映棧的當前位置。

棧的基本操作

棧的基本操作主要有以下六種。

initstack(&s):初始化操作,構造乙個空棧s.

stackempty(s):若棧s為空棧,返回1,否則返回0.

push(&s,e):插入元素e為新的棧頂元素。

pop(&s,&e):刪除s的棧頂元素,並用e返回其值。

gettop(s,&e):用e返回s的棧頂元素。

clearstack(&s):將s清為空棧。

棧的儲存結構

棧的順序儲存用向量作為棧的儲存結構,向量s表示棧,m表示棧的大小,用指標top指向棧頂位置,s[top]表示棧頂元素,當在棧中進行插入、刪除操作時,都要移動棧指標;而當top=m-1時,則棧滿當top=-1時,表示棧空。同時為了避免浪費空間可以採用雙棧機制,即向量的兩端為棧底。

棧的鏈式儲存結構

棧的鏈式儲存也叫鏈棧,我們把插入和刪除均在煉表表頭進行的鍊錶稱為鏈棧。鏈棧也分有頭節點和無頭節點兩種。帶頭節點的鏈根操作比較方便。

棧的應用

棧具有廣泛的應用,例如,求表示式的值及遞迴到非遞迴等。

例如,表示式求值

計算機在處理算術表示式時,可將表示式先轉換為字尾形式,然後利用棧進行計算。例如,表示式46+5*(120-37)的字尾表示式形式為46 5 120 37-*+(當然啦你要先知道這個是怎麼來的),計算字尾表示式時,從左至右掃瞄表示式:若遇到運算物件,則壓入棧中;遇到運算子,則從棧頂彈出運算物件進行計算,並將運算結果壓入棧中。

重複以上過程,直到字尾表示式結束。例如,字尾表示式46512037-*+

依次將46,5,120,37壓入棧中。

遇到-,彈出37和120,計算120-37,得83,將其壓入棧中。

遇到*,彈出83和5,計算5*83,得415,將其壓入棧中。

遇到+,彈出415和46,計算46+415,得461,將其壓入棧中。

表示式結束,計算完成,棧頂為計算結果。

要注意的是遵循先乘除後加減然後把運算子放到數字後面

佇列的定義

佇列(queue)是一種只允許在一端進行插入,而在另一端進行刪除的線性表,是一種操作受限的線性表。在表中只允許進行插入的一端稱為隊尾(rear),只允許進行刪除的一端稱為隊頭(ront)。佇列的插入操作通常稱為入佇列或進佇列,而佇列的刪除操作則稱為出佇列或退佇列。當佇列中無資料元素時,稱為空佇列。

由佇列的定義可知,隊頭元素總是最先進佇列的,也總是最先出佇列;隊尾元素總是最後進佇列,因而也是最後出佇列。這種表是按照先進先出(first in first out,fifo)的原則組織資料的,因此,佇列也被稱為「先進先出」表。

佇列的基本操作

佇列的基本操作主要有以下六種。

initqueue(&q):初始化操作,構造乙個佇列q.

queueempty(q):若棧q為空佇列,則返回1,否則返回0.

equeue(&q,e):插入元素e到佇列q的尾.

oqueue(&q,&e):刪除q的隊首元素,並用e返回其值。

getqhead(q,&e):用e返回q的隊首元素。

clearqueue(&q):將q清空為空隊。

佇列的順序儲存結構

順序儲存結構採用一維陣列(向量)實現,設佇列頭指標front和佇列尾指標rear,並且假設front指向隊頭元素的前一位置,rear指向隊尾元素。若不考慮隊滿,則入隊操作語句為q[rear++]=x;若不考慮隊空,則出隊操作語句為x=q[++front]。當然,出隊時,並不一定需要隊頭元素(與退棧類似)。

按上述的做法,有可能出現假溢位,即隊尾已到達一維陣列的高階,不能再入隊,但因為連續出隊,佇列中元素個數並未達到最大值。解決這種問題,可用迴圈佇列。在迴圈佇列中,需要區分隊空和隊滿:仍用front=rear表示佇列空,在犧牲乙個單元的前下,用front==(rear+1)%max表示佇列滿。在這種約定下,入隊操作的語句為:rear=(rear+1)%max,max,q[rear]=x;出隊操作語句為:front=(front+1)%max。

佇列的鏈式儲存結構

佇列的鏈結實現稱為鏈隊,鏈隊實際上是乙個同時帶有頭指標和尾指標的單鏈表。頭指標指向隊頭節點,尾指標指向隊尾節點即單鏈表的最後乙個節點。為了簡便,鏈隊設計成乙個帶頭節點的單鏈表。

迴圈佇列中的邊界條件判別準則

判別迴圈佇列的「空」或「滿」不能以頭尾指標是否相等來確定,一般是通過以下幾種方法:一是另設乙個布林變數來區別佇列的空和滿;二是少用乙個元素的空間,每次入隊前測試入隊後頭尾指標是否會重合,如果會重合就認為佇列已滿;三是設定乙個計數器

記錄佇列中元素總數,不僅可判別空或滿,還可以得到佇列中元素的個數。

雙端佇列的作用

字串(string)是一串文字及符號的簡稱,是一種線性表。字串中的元素是字元,計算機中非數值問題處理的物件經常是字串,如在彙編和高階語言的編譯程式中,源程式和目標程式都是字串;在事務處理程式中,姓名、位址等一般也是作為字串處理的。

串的定義及基本運算

串是僅由字元構成的有限序列,是取值受限的線性表。一般記為s=a1a2…a,其中s是申名,單引號括起來的字串行是串值。

基本術語

串的基本操作

①賦值操作strassign(s,t):將串t的值賦給串s。

②連線操作concat(s.t):將串t接續在串s的尾部,形成乙個新串。

③求串長strlength(s):返回串s的長度。

④串比較strcompare(st):比較兩個串的大小,返回值-1、0和1分別表示sct、st和s>t三種情況。

⑥求子串substring(s,start.len):返回串s中從stat開始的、長度為en的字串行。

串的儲存結構

串可以採用順序儲存或鏈式儲存。

串的順序儲存。單的順序儲存是指用一組位址連續的儲存單元來儲存串值的字行序列。由於串中的元素為字元,所以可通過程式語言提供的字元陣列定義串的儲存空間,也可以根據串長的需要動態申請字串的空間。

串的鏈式儲存。字串也可以採用鍊錶作為儲存結構,當用鍊錶儲存串中的字元時,需要考慮儲存密度問題,每個結點中可以儲存乙個字元,也可以儲存多個字元。用結點大小為4的鍊錶表示字串"abcdefghij",如下圖所示。

在鏈式儲存結構中,結點大小的選擇和順序儲存方法中陣列空間大小的選擇一樣重要,它直接影響串運算的效率。

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...