棧(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作與順序棧一致。在入棧出棧的操作上更偏向類似單鏈表中的插入刪除操作。總結來說 棧類似乙個死胡同,先進的只能後出,後進的只能先出。具體實現 資料結構課本上有些十分詳細的介紹。通過資料查...