棧的定義及基本演算法實現

2021-10-04 02:13:18 字數 4007 閱讀 5123

棧定義:是一種只能在一端進行插入或刪除操作的線性表

1)允許 進行插入、刪除操作的一端稱為 棧 頂 。

2)表的另一端稱為 棧底 。

3)當棧中沒有資料元素時 , 稱為 空棧 。

4)棧的插入操作通常稱為 進棧 或 入 棧 。

5)棧的刪除操作通常稱為 退棧 或 出棧 。

例如:死胡同就是乙個棧;洗1疊碗時的取放;

棧據有先進後出特點可以理解為桶狀結構;

例: 設乙個棧的輸入序列為a,b,c,d, , 則借助乙個棧所得

到的輸出序列不可能是 。

a. c,d,b,a b. d,c,b,a

c. a,c,d,b d. d,a,b,c

解答:a:a,b,c進棧c出棧,進棧d,d 出棧,後b,a 出棧;a正確

b: a,b,c,d 出棧,d,c,b,a 出棧; b正確

c: a進棧a出棧,b,c進棧,c出棧,d進棧d出棧,後b 出棧;c正確

d:a,b,c,d進棧,應該為d,c,b,a出棧,d錯誤

同理乙個棧的輸入序列為1 2 3 4 5,則下列序列中不可能是棧的輸出序列的是( )

a.2 3 4 1 5 b.5 4 1 3 2 c.2 3 1 4 5 d.1 5 4 3 2

這題就選b

邏輯結構->儲存結構

棧中元素邏輯關係與線性表的相同,棧可以採用與線性表相

同的儲存結構。

棧—1.順序棧 and 2.鏈棧

1.順序棧棧的順序儲存方式就是在順序表的基礎上對插入和刪除操作限制它們在順序表的同一端進行,所以同順序表一樣也可用一維陣列表示。一般地,可以設定乙個足夠大的一維陣列儲存棧,陣列中下標為0的元素就是棧底,對於棧頂,可以設乙個指標top指示它。

基本操作演算法(這裡以top=0為例)

注意(top=-1時有些步驟不同,應根據定義實現演算法)

(1)初始化棧initstack(&s)

(2)銷毀棧destroystack(&s)釋放棧s占用的儲存空間。

(3)判斷棧是否為空stackempty(s);此時top=0

(4)進棧push(&s,e)

(5)出棧pop(&s,&e)

(6)取棧頂元素gettop(s,&e) 在棧不為空的條件下將棧頂元素賦給e

實現**如下,

#include

#include

//棧抽象資料型別=邏輯結構+基本運算(運算描述)

//棧的順序儲存結構的c語言描述如下:

#define maxsize 100

typedef

int datatype;

typedef

struct

sequence_stack;

sequence_stack s;

//(1)初始化棧initstack(&s)建立乙個新的空棧s,實際上是將棧頂指標指向-1即

//(2)銷毀棧destroystack(&s)釋放棧s占用的儲存空間。

//(3)判斷棧是否為空stackempty(s);此時top=0

//(4)進棧push(&s,e)

//(5)出棧pop(&s)

//(6)取棧頂元素gettop(s,&e)

//(1)

void

initstack

(sequence_stack*

&s)//(2)

void

destroystack

(sequence_stack*

&s)//(3)是空表就返回1;

intstackempty

(sequence_stack s)

//(4)

intpush

(sequence_stack *

&s,datatype e)

s->a[s->top]

=e; s->top++

;return1;

}//(5)出棧pop(&s)

intpop

(sequence_stack *

&s )

s->top--

;return1;

}//(6)取棧頂元素gettop(s,&e)

bool gettop

(sequence_stack s,datatype *

&e)

2.鏈棧鏈式棧:採用鏈結儲存的棧結構

棧的鏈式儲存結構實際上就是乙個單鏈表,叫做鏈棧。插入和刪除操作只能在鏈棧的棧頂進行;棧頂指標top就是鍊錶的頭指標。

如何改造鍊錶實現棧的鏈結儲存?

1.將哪一端作為棧頂?答:將鏈頭作為棧頂,方便操作。

2.鏈棧需要加頭結點嗎?答:鏈棧不需要附設頭結點;

鏈棧的4 要素:

棧空條件:s- ->next=null

棧滿條件: 不考慮

進棧e 操作: 將包含e 的節點插入到頭節點之後

退棧操作: 取出頭節點之後節點的元素並刪除之

#include

#include

typedef

int datatype;

typedef

struct node

linknode;

typedef linknode * linkstack;

//linknode *<=>linkstack

linkstack top;

//(1) 初始化棧initstack(&s)

//建立 乙個空棧s。建立鏈棧的頭節點,並將其next域置為null。

void

initstack

(linknode *

&s)//(2)取得鏈式棧的棧頂結點

datatype read

(linkstack top)

return

(top->info);}

//(3)向鏈式棧中插入乙個值為x的結點,結點分配乙個空間將其鏈結為top;

linkstack push

(linkstack top,datatype x)

//(4)鏈棧的實現-刪除棧頂元素

linkstack pop (linkstack top)

p=top;

top=top->next;

free

(p);

return top;

}int

main()

總結順序棧和鏈棧的比較

時間效能:相同,都是常數時間o(1)。

空間效能(儲存結構不同)

➢ 順序棧:

(1)有元素個數的限制和空間浪費的問題。

(2)注意:top=0與top=-1時的不同;原因儲存結構與邏輯結構不同

➢ 鏈棧:

(1)沒有棧滿的問題,只有當記憶體沒有可用空間時才會出現棧

滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷

總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,

反之,應該採用順序棧。

(2)注意:① 讀棧頂(鏈式儲存)結點值;② 鏈式棧的插入及刪

除(即進棧及出棧);

棧的定義及基本操作

1 定義 棧是僅限定在表的一端操作的線性表 2 性質 先進後出 後進先出 3 棧的儲存方式 順序儲存和鏈式儲存 順序棧的型別定義 typedef struct stack 棧的壓入操作 1 首先判斷是否棧滿,若棧滿,則輸出 棧滿溢位 2 先指標top 棧元素值 push s,e return s 棧...

7 棧的定義及實現

一 棧的定義 棧是一種特殊的線性表 棧通常有兩種實現方式 順序結構實現和鏈式結構實現 性質 後進先出 lifo last in first out 二 棧的應用實戰 編譯器符號成對檢測 當需要檢測成對出現但又互不相鄰的事物時,使用棧的 後進先出 特性 演算法思路 從第乙個字元開始掃瞄 當遇見普通字元...

棧的基本方法及實現

棧 stack 一種特殊的 線性表,其只允許在固定的一端 棧頂 進行插入和刪除元素操作 另一端為棧底 棧中的資料元素遵循先進後出 lifo 的原則。棧的一些基本方法 1.public stack 建立棧 2.public e push 入棧 3.public e pop 出棧 刪除棧頂元素 4.pu...