棧 學習筆記 總結

2021-08-04 08:43:43 字數 2623 閱讀 7242

棧(stack)是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧的頂。對棧的基本操作有push(進棧)和 pop(出棧),前者相當於插入,後者則是刪除最後插入的元素。所以棧有時叫做lifo(後進先出)表。

part 1 棧的基本了解

對棧的第一次接觸也是在c語言的學習中。不同的資料存放的方式不同,使用的機制也相應不同。普通函式的呼叫,遞迴等都要用到棧。

對棧的實現有兩種方法,一種方法使用指標,而另一種方法則是使用陣列。

用指標實現,則是使用鍊錶。通過之前的學習知道,鍊錶有頭部和尾部,那麼如果要用鍊錶,顯然應該用頭部來作為棧表的頂。因為我們使用的是單向鍊錶,如果要用尾部作為棧的頂,就必須知道倒數第二個結點和尾部結點的指標,操作起來是相對麻煩而且費時的。因為鍊錶的頭部將會一直存在,否則整個鍊錶將不復存在,所以用頭部來作為頂,更加簡單。

**實現:

1.構建結構體

struct node

2.建立乙個空棧的例程

stack

creatstack( void )

void

makeempty( stack s )

3.檢測棧是否是空棧

int 

isempty( stack s )

4.push進棧的例程

void

push( elementtype x, stack s)

}

5.從棧彈出元素的例程

void

pop( stack s )

}

第二個方法就是通過陣列來實現。

如果要使用陣列,我認為有以下幾個需要注意的地方。

1.必須宣告陣列的大小,在一直最大數量的情況下進行操作。

2.只能通過陣列建立同型別資料的棧表,最好使用結構體來實現。

3.在資料龐大的情況下可能會造成數值溢位。

通過陣列實現的思想大概與鍊錶相同。但是陣列的儲存方式是連續的,通常情況下我們可以直接通過訪問下表的方式來訪問陣列中的成員。但是此例中我們必須判斷此表是否為空表。所以還是必須在結構體中用到指標。

下面列出部分與鍊錶差異較大的**。

1.結構體的建立

struct stackrecord

2.棧的建立

stack

createstack(int maxelemnts) //定義乙個變數記錄最大成員個數

陣列實現,源**

#include

#include

using

namespace

std;

typedef

struct stackrecord

stack;

stack createstack(void);

void disposestack(stack s);

stack push(char x, stack s);

stack pop(stack s);

char topandpop(stack s);

//定義全域性變數

int maxelements = 20;

int minstacksize = 25;

int count = 0;

int isempty(stack s) //判斷棧是否為空

int isfull(stack s) //判斷棧是否為滿

int main()

if(i == 2)

}return0;}

stack createstack(void) //建立棧

stack s;

s.array = (char*)malloc(sizeof(char)*maxelements); //建立動態陣列

if(s.array == null)

s.capacity = maxelements;

s.topofstack = -1; //makeempty

return s;

}void disposestack(stack s) //釋放動態記憶體 }

stack push(char x, stack s)

else

} stack pop(stack s)

else

}

part2 棧的應用

1.平衡符合

用棧的方法編**查詢源**中符號錯誤匹配

2.字尾表示式

在之前的計算中我們常用形式一般是4.99+5.99+6.99*1.06

但是利用棧可以將其轉化成字尾表示式或逆波蘭記法。

形如 4.99 1.06 * 5.99+6.99 1.06 * +

3.函式呼叫

總結理解…繼續理解…

棧 學習筆記

1.實現乙個棧,支援入棧,出棧,查詢棧中最小值的功能,時間複雜度要求為常數 用陣列模擬棧操作 查詢最小值的話可以另外使用乙個陣列記錄當前下標的最小值 includeusing namespace std const int maxn 1e5 struct queue void push int x ...

學習筆記 棧

顯然,由於只能對一端進行操作,棧中的元素是先進後出的。棧的寫法 手寫棧int s n sz s i 表示棧中從下往上數第i個數的值,n表示棧的大小,sz表示當前棧中元素數量 void push int x void pop int top stl stacks 引數也是資料型別,這是棧的定義方式 s...

棧的學習總結

鏈棧其結點結構與單鏈表一致。首先第一步與單鏈表構建一致,先定義結點。每個結點儲存著資料也儲存這下面資料的位址。基本操3作與順序棧一致。在入棧出棧的操作上更偏向類似單鏈表中的插入刪除操作。總結來說 棧類似乙個死胡同,先進的只能後出,後進的只能先出。具體實現 資料結構課本上有些十分詳細的介紹。通過資料查...