出棧順序的全部可能性公式 四 順序棧

2021-10-18 01:52:03 字數 2252 閱讀 6008

棧的定義:限定僅在表尾進行插入和刪除操作的線性表。同時因為只能在表尾進行操作,所以棧又稱為後進先出的線性表。見下圖,淺灰色的元素後進入棧結構,出棧的時候卻是第乙個出去。

我們針對棧結構元素的插入和刪除,分別叫做「push」壓棧和「pop」彈棧。

既然棧是線性表,而線性表包括順序表和煉表,那麼同樣棧也包括順序棧和鏈棧。順序棧中我們定義乙個top指標,其實這裡只是個游標,對應著棧頂元素的下標,比如top是0,那棧頂元素下標就是0,表示只有乙個0號元素,通常規定如果top等於-1,表示空棧。見下圖所示,乙個有5個元素空間的順序棧結構,當top=1時,有兩個元素,top=-1時,空棧,top=4時,滿棧。

那麼進棧操作就很明顯,只要移動我們的top游標即可,進乙個top++,而刪除的時候則top--

那麼我們就來實現下順序棧的push和pop,以及清空棧clear

還是先定義一下資料元素,包含乙個id和乙個name

typedef struct dataelement

dataelement;

接著定義順序棧結構,包括陣列元素、top指標(游標)、陣列長度

typedef struct seqstack

seqstack;

然後我們來實現一下壓棧push操作。注意:我們插入的元素下標是要將top加加後得到的值,因為top加加後才指向新的元素空間。

void pushseqstack(seqstack* seqstack, dataelement element)

seqstack->top++;

seqstack->elements[seqstack->top] = element;

seqstack->length++;

return;

}

接著實現彈棧pop操作,同理我們需要先將top值減減。

void popseqstack(seqstack* seqstack)

seqstack->top--;

seqstack->length--;

return;

}

然後實現一下初始化函式,初始化陣列的長度和top指標後,直接壓棧即可。

void initseqstack(seqstack* seqstack, int length, dataelement* dataarray)

}

接著實現清空棧,直接將top賦值-1,陣列長度歸零即可。

void clearseqstack(seqstack* seqstack)

然後是「是否為空」函式,也很簡單,只需判斷top是否為-1

int isempty(seqstack* seqstack)

最後為了測試,實現乙個列印順序棧。這和遍歷陣列沒多大區別。

void printseqstack(seqstack* seqstack)

for (int i = 0; i < seqstack->length; i++)

}

接著我們測試一下,先初始化待插入的資料元素

dataelement dataarray =

, ,,};

然後實現測試函式,這次我們動態分配順序棧空間,然後將4個元素全部壓入棧中,接著將表尾元素彈棧,最後清空棧。

void testseqstack()

編譯執行,可以看到,彈棧後4號元素「漢庫克」(下標為3的元素)被刪除了。清空後也是沒問題。

優點:順序棧在插入和刪除時候不需要移動元素,只需移動top指標。

缺點:順序棧和順序表一樣,都需要預先定好陣列空間,不像鍊錶那樣機動。

「根據入棧順序判斷可能的出棧順序」python語言

題目描述 輸入兩個整數序列,其中乙個序列表示棧的push 入 順序,判斷另乙個序列有沒有可能是對應的pop 出 順序。class stack 實現棧的功能 def init self self.items 判斷棧是否為空 def empty self return self.items none 返...

輸出所有可能的出棧順序

構造棧類結構體 stack void initstack stack s,int n 初始化棧的結構 void copystack stack ss,stack s 複製函式 void outputstack stack s 輸出函式 intstackempty stack s 判斷棧是否為空 vo...

關於給定入棧順序,求所有可能的出棧順序的討論

最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑 現在也是 於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到 n 2n n n 1 該公式 c 2n,n n 1 c 2n,n 表示2n裡取...