DS 0827(第三章 棧)

2021-10-24 03:54:12 字數 2740 閱讀 3613

def:只允許在一端進行插入和刪除操作的線性表(只能從表尾刪除,插入)

空棧:棧頂:允許插入和刪除的一端

棧頂:不允許插入和刪除的一端

後進先出 lifo

邏輯結構:與普通線性表相同

棧的基本操作

initstack(&s):初始化棧。創造乙個空棧s。分配記憶體空間

destorystack(&l):銷毀棧。銷毀並釋放棧s所占用的記憶體空間

push(&s,x):進棧。若棧s未滿。則將x加入使之成為新棧頂

pop(&s,&x):出棧。若棧s非空,則彈出棧頂元素,並用x返回 增刪

gettop(s,&x):讀棧頂元素。若棧s非空,則用x返回棧頂元素 查

棧的使用場景大多只訪問棧頂元素

stackempty(s):判斷乙個棧s是否為空。若s為空,則返回true,否則返回false。

常見問題:已知進棧順序,有哪些合法的出棧順序

如:a->b->c->d->e

n個不同元素進棧,由於出棧順序和進棧順序可以穿插進行,所以出棧元素不同的排列的個數為1/n+1cn,2n,上述公式稱為卡特蘭數。可採用數學歸納法證明。

**順序棧的實現:**用順序儲存方式實現的棧

基本操作:

創:初始化

增:進棧

刪:出棧

查:獲取棧頂元素

判空,判滿

#define maxsize 10						

//定義棧中元素的最大個數

typedef

struct

sqstack;

//sequence--順序

void

teststack()

**順序儲存:**給各個資料元素分配連續的儲存空間,大小為。maxsize*sizeof[elemtype]。另外還需要4個位元組的大小,用於存放棧頂指標,只向棧頂元素。

#define maxsize 10						

//定義棧中元素的最大個數

typedef

struct

sqstack;

//sequence--順序

void

teststack()

//初始化棧

void

initstack

(sqstack &s)

void

teststack()

//判空操作

bool

stackempty

(sqstack s)

進棧操作(增)

#define maxsize 10						

//定義棧中元素的最大個數

typedef

struct

sqstack;

//sequence--順序

void

teststack()

//初始化棧

void

initstack

(sqstack &s)

bool

push

(sqstack &s,elemtype x)

出棧操作

#define maxsize 10						

//定義棧中元素的最大個數

typedef

struct

sqstack;

//sequence--順序

void

teststack()

//初始化棧

void

initstack

(sqstack &s)

bool

pop(sqstack &s,elemtype &x)

讀取棧頂元素的操作

bool

gettop

(sqstack s,elemtype &x)

進棧:s.data[s.top++]=x;

出棧:x=s.data[–s.top];

棧滿的條件:top=maxsize;

順序棧的缺點:棧的大小不可以改變

兩個棧共享同一片空間

#define maxsize 10

typedef

struct

shstack;

//初始化棧

void

initstack

(shstack &s)

0號棧重下往上遞增,1號棧重上往下遞減,邏輯上有兩個棧,物理上公用同一片空間

補:在頭插法建立單鏈表時,是不斷的對頭節點進行後插操作—對應於棧操作中的進棧

在對單鏈表進行刪除操作時,對頭節點進行後刪操作-----對應於出棧

typedef

struct linknode

*listack;

同樣可以定義帶頭節點的鏈棧與不帶頭結點的鏈棧,這兩種方式在判空的時候會有區別

見單鏈表

DS第三章小結

一 你對本章內容的小結 本章主要講了兩種特殊的線性表,棧和佇列。棧是僅在表尾進行插入或刪除操作且後進先出 lifo 的線性表,而佇列則是在表的一端插入,另一端刪除元素且先進先出 fifo 的線性表。同時,課本的案例引入告訴我們,棧可以解決數值的轉換,括號匹配的檢驗問題 而佇列因其結構的吻合可以用了舞...

第三章 棧和佇列

棧和佇列 一 棧 1 棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。2 在任何時候出棧的元素都只能是棧頂元素,即最後最後入棧者最先出棧。所以棧中元素除了具有線性關係外,還具有後進先出的特性。3 棧的抽象資料型別定義 ...

第三章 棧和佇列

棧和佇列是兩種常用的資料結構,同時又是操作受限的線性表,也是兩種重要的抽象資料型別。1 1棧是限定僅在表尾進行插入和刪除操作的線性表。棧中元素具有線性關係和後進先出的特性。2雖然對插入和刪除操作的位置限制減少了棧的靈活性,但同時也使得棧的操作更有效更容易實現。3棧的儲存結構分兩種,一種是順序儲存結構...