棧和隊列
都是動態的集合,在棧中,能夠去掉的元素是最近插入的哪個。棧實現了後進先出。在隊列中,能夠去掉的元素老是在集合中存在的時間最長的那一個。隊列實現了先進先出的策略。數組
棧的官方定義:棧(Stack)是一個後進先出(Last in first out,LIFO
)的線性表,它要求只在表尾進行刪除和插入操做。對於棧來講,這個表尾稱爲棧的棧頂,相應的表頭稱爲棧底。入棧使用push()
方法。出棧使用pop()
方法。this
最開始棧中不含有任何數據,叫作空棧,此時棧頂就是棧底。而後數據從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。數據出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。spa
咱們把做用於隊列上的INSERT
操做稱爲入隊(Enqueue
),把做用於隊列上的DELETE操做稱爲出隊(Dequeue)。咱們使用變量top來記錄棧頂元素的位置和標記哪裏能夠加入新的元素,當向棧內壓入元素時,該變量增大;從棧內彈出元素時,該變量減少。指針
棧的插入和刪除操做都是在一端進行的,而隊列的操做倒是在兩端進行的。code
typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack;
這裏定義了一個順序存儲的棧,它包含了三個元素:base,top,stackSize。blog
其中base是指向棧底的指針變量,top是指向棧頂的指針變量,stackSize指示棧的當前可以使用的最大容量。隊列
#define STACK_INIT_SIZE 100 initStack(sqStack *s) { s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) ); if( !s->base ) exit(0); s->top = s->base; // 最開始,棧頂就是棧底 s->stackSize = STACK_INIT_SIZE; }
入棧操做又叫壓棧操做,就是向棧中存放數據。element
入棧操做要在棧頂進行,每次向棧中壓入一個數據,top指針就要+1,知道棧滿爲止。it
出棧操做就是在棧頂取出數據,棧頂指針隨之下移的操做。io
每當從棧內彈出一個數據,棧的當前容量就-1。
入隊列操做其實就是在隊尾追加一個元素,不須要任何移動,時間複雜度爲O(1)。
出隊列則不一樣,由於咱們已經架設下標爲0的位置是隊列的隊頭,所以每次出隊列操做全部元素都要向前移動。
push():入棧操做 pop():出棧操做(返回棧頂元素並刪除t) peak():返回棧頂元素而不刪除它 clear():清除棧內全部元素 length():記錄棧內元素的個數 empty屬性:表示棧內是否含有元素
function Stack(){ this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; }
用一個數組dataStore
來保存棧內元素,變量top記錄棧頂位置
先來實現push()
方法,當向棧中壓入一個新元素時,須要將其保存在數組中變量top對應的位置,而後將top值加1:
function push(element){ this.dataStore[this.top++] = element;//top值加1,指向下一個空位置 }
function pop(){ return this.dataStore[--this.top];//pop方法與push相反 }
peek
方法返回數組的第一個top-1
位置的元素,即棧頂元素:
function peek(){ return this.dataStore[this.top-1]; }
length
方法經過返回變量top值的方法返回棧內的元素的個數:
function length(){ return this.top; }
將變量top
的值設爲0,就能夠清空一個棧了:
function clear(){ this.top = 0; }