js數據結構和算法(二)棧和隊列

基本概念

棧和隊列都是動態的集合,在棧中,能夠去掉的元素是最近插入的哪個。棧實現了後進先出。在隊列中,能夠去掉的元素老是在集合中存在的時間最長的那一個。隊列實現了先進先出的策略。數組

棧的官方定義:棧(Stack)是一個後進先出(Last in first out,LIFO)的線性表,它要求只在表尾進行刪除和插入操做。對於棧來講,這個表尾稱爲棧的棧頂,相應的表頭稱爲棧底。入棧使用push()方法。出棧使用pop()方法。this

最開始棧中不含有任何數據,叫作空棧,此時棧頂就是棧底。而後數據從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。數據出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。spa

2.gif

咱們把做用於隊列上的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。

隊列的順序存儲結構

1.jpg

入隊列操做其實就是在隊尾追加一個元素,不須要任何移動,時間複雜度爲O(1)。

出隊列則不一樣,由於咱們已經架設下標爲0的位置是隊列的隊頭,所以每次出隊列操做全部元素都要向前移動。

2.jpg

棧的方法和屬性

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()方法

先來實現push()方法,當向棧中壓入一個新元素時,須要將其保存在數組中變量top對應的位置,而後將top值加1:

function push(element){
        this.dataStore[this.top++] = element;//top值加1,指向下一個空位置
    }

pop()方法

function pop(){
    return this.dataStore[--this.top];//pop方法與push相反
}

peek()方法

peek方法返回數組的第一個top-1位置的元素,即棧頂元素:

function peek(){
    return this.dataStore[this.top-1];
}

length()方法

length方法經過返回變量top值的方法返回棧內的元素的個數:

function length(){
    return this.top;
}

clear()方法

將變量top的值設爲0,就能夠清空一個棧了:

function clear(){
    this.top = 0;
}
相關文章
相關標籤/搜索