p33鏈結的棧和佇列

2022-08-09 07:51:07 字數 2720 閱讀 8361

一、鏈棧的定義與運算

鏈棧(即鏈結堆疊)是棧的鏈結儲存表示,或者說它是只允許在表頭進行插入和刪除運算的單鏈表,此時單鏈表的表頭指標叫做棧頂指標。乙個鏈棧的示意圖如下圖所示,其中hs

表示棧頂指標。設

hs的型別為

linklist(

指標型別

),資料元素

x的型別為

elemtype,

則在以hs

為棧頂指標的鏈棧中,進行棧的各種運算的演算法如下:

1、進棧演算法

演算法步驟為:

push(hs,x)

new(p)

p^.data:=x

p^.next:=hs

hs:=p

2、出棧演算法

假定以函式的形式寫出,則演算法步驟為:

(1)檢查

hs是否為空,若為空則進行「下溢」錯誤處理;

(2)將棧頂結點的值賦給函式名,並將棧頂指標暫存

p,以便**棧頂結點;

(3)刪除棧頂結點;

(4)**

p^結點(即原棧頂結點)。

演算法描述為:

pop(hs):elemtype;

if hs=nil then error(『underflow』)

pop:=hs^.data

p:=hs

hs:=hs^.next

dispose(p)

3、讀取棧頂元素的演算法

此演算法很簡單,若不考慮棧空的情況,只要取出hs^.data

的值即可。

4、置棧空演算法

若不考慮**結點,則只要將hs

置空即可。若考慮**鏈棧中的所有結點,則演算法如下:

setnull(hs);

while hs<>nil do

p:=hs

hs:=hs^.next

dispose(p)

5、判斷乙個棧是否為空的演算法

此演算法很簡單,只要當hs=nil

時返回「真」值,否則返回「假」值即可。

二、鏈隊的定義與運算

鏈隊(即鏈結佇列)是佇列的鏈結儲存表示,或者說它是只允許在表尾進行插入和表頭進行刪除的單鏈表。乙個鏈隊需要隊首和隊尾兩個指標,其中隊首指標f

指向單鏈表的表頭,隊尾指標

r指向單鏈表的表尾。乙個鏈隊的示意圖如下圖所示。設f和

r的型別為

linklist(

指標型別

),則描述f和

r的結點型別可以定義為:

type 

linkqueue=record

f,r:linklist

end;

設hq為具有

linkqueue

型別的乙個引數,它表示乙個鏈隊,x為具

elemtype

型別的乙個引數,在

hq鏈隊中進行插入、刪除和置空隊運算的演算法如下:

1、 插入演算法

(1)、為待入隊元素

x分配乙個結點

p^,並把x賦給

p^的值域,

nil賦給

p^結點的指標域;

(2)若鏈隊為空(即

hq.f

和hq.r

均為空,檢查時判任乙個為空即可),則表明待插入的

p^結點既是隊首結點也是隊尾結點,應同時修改隊首指標和隊尾指標,使之指向

p^結點,否則把

p^結點插入隊尾,並使隊尾指標指向

p^結點。

演算法描述為:

insert(hq,x)

new(p)

p^.data:=x

p^.next:=nil

if hq.r=nil

then 

hq.f:=p

hq.r:=p

else

hq.r^.next:=p

hq.r:=p

2、刪除演算法

演算法步驟為:

(1) 若鏈隊為空,則進行「下溢」錯誤處理;

(2) 把佇列首結點的值賦給變參x

;(3) 把隊首指標暫存指標變數p,

以便**該結點;

(4) 刪除隊首結點,即若鏈隊中只有乙個結點(即hq.f=hq.r),

則應同時把

hq.f

和hq.r

置為空,否則只修改隊首指標,使之指向下乙個結點;

(5) **原隊首結點(即p^

結點)。

演算法描述為:

delete(hq,x)

if hq.f=nil then writeln(『underflow』)

x:=hq.f^.data

p:=hq.f

if hq.f=hq.r

then 

hq.f:=nil

hq.r:=nil

else

hq.f:=hq.f^.next

dispose(p)

3、置鏈隊為空的演算法

此演算法很簡單,只要把隊首和隊尾指標置空即可。

setnull(hq)

hq.f:=nil

hq.r:=nil

不過這樣佇列中的所有動態結點沒有**,大量浪費了空間,因此可以進行如下改進:

setnull(hq)

p:=hq.f

while p<>hq.r do

q:=p^.next

dispose(p)

p:=q

dispose(p)

hq.f:=nil

hq.r:=nil

P33 字串的基本操作

include include using namespace std 字串 1 c語言的字串 以零結尾的字串 2 在c語言中沒有字串型別 通過字元陣列 來模擬字串 3 字串的記憶體分配 堆上 棧上 全域性區 很重要 void main51 2 不指定長度 c編譯器會自動幫助程式設計師 求元素的個數...

p130 棧和佇列

兩個程式的功能都是輸入0就出棧 出佇列 輸入1就是入棧 入佇列 輸入 1結束 棧 stack.c created on feb 22,2016 author wing stack.c created on feb 22,2016 author wing include include define ...

Gauss消元 求線性方程組的解 洛谷P3389

題目戳這裡 高斯消元模板 輸入格式如下 na1 a2 a3 an b1 共n個線性方程構成的方程組 輸出 ans i 表示x i gauss消元 給定線性方程組 a11 x1 a12 x2 a1n xn b1 a21 x1 a22 x2 a2n xn b2 an1 x1 an2 x2 ann xn ...