如何用C 實現棧

2022-01-10 09:23:42 字數 3467 閱讀 6317

簡單定義:棧就是一種只允許在表尾進行插入和刪除操作的線性表

舉乙個生活中的例子:我在乙個儲物箱中,堆了一堆衣服,我的一件球衣在最下面,而我要拿這件衣服,就意味著我必須將上面的衣服全部拿出來才可以,但是由於箱子只有乙個口,我也只能從上面拿東西,心裡還默默想著,當初就不該將球衣早早的放進去,導致結果就是先進後出!

你就不能舉個計算機中的例子?這就安排!

計算機中很多操作都是使用棧的原理來實現的,我們就比如常見的瀏覽器中的 「前進鍵」 「後退鍵」 就可以利用棧的原理來實現,我們來用圖說明一下

我們想要實現前進後退,可以使用兩個棧(暫時稱作 m、n)來實現

棧頂:允許進行插入和進行刪除操作的一段成為棧頂

棧底:表的另一端稱為棧底 (第乙個元素進入的位置)

壓棧:在棧頂位置插入元素的操作叫做壓棧,或入棧、進棧

出棧:刪除棧頂元素的操作叫做出棧,也叫作彈棧,或者退棧

空棧:不含元素的空表

棧溢位:當棧滿的時候,如果再有元素壓棧,則發生上溢,當棧空的時候,再出棧則發生下溢

自定義異常類

*/// 用於檢查範圍的有效性

class outofrange:public exception

};

// 用於檢查長度的有效性

class badsize:public exception

};#endif

開頭我們就已經提過了,棧實際上就是一種線性表的特例,所以棧的實現和線性表一樣,均使用陣列實現,我們使用乙個一維陣列來儲存元素,那麼總得有個頭阿,我們就需要確定棧底的位置,通常我們選擇 0 的一端作為棧底,這樣更加方便理解與操作,特別的是,我們設定了乙個整型變數top 用來存放棧頂元素的位置(下標),也稱作棧頂指標

初始的時候,給top賦值-1,表示棧為空,元素進棧以後,top + 1,元素出棧後,top - 1

//  array-based stack: definition and implementation for some methods 

#ifndef _seqstack_h_

#define _seqstack_h_

#include "stack.h"

template class seqstack : public stack

~seqstack()

bool empty() const

int size() const

void clear() // 清空棧內容

void push(const t &value);

t pop();

t gettop() const;

}; #endif

template void seqstack::push(const t &value)
template t seqstack::pop()
template t seqstack::gettop() const
template void seqstack::resize()
棧這種資料結構相比較於線性表,沒了有插入和刪除的時候需要移動元素的情況,但是仍然有乙個比較大的不足,那就是我們必須事先分配空間大小,如果一旦空間滿了,再有元素近棧就必須使用程式設計手段對陣列進行擴容,還是比較麻煩的

而有時候我們往往需要多個棧,我們之前的處理手段就是盡量的根據實際問題設計大小合適的陣列,但是這顯然是有一定難度的,而且常常是這樣的,乙個棧已經滿了,而另乙個棧可能還空著很多空間,如果能將那些空閒的位置利用起來就好了,而我們下面就要來提到乙個這樣的技巧的思路

我們其實就是將兩個棧的棧底全部放到了,陣列的兩端,然後兩個棧處於相向位置,逐漸向中間靠攏,只要兩個top指標不相遇,兩個棧就可以一直用

鏈棧就是使用鏈式儲存結構的棧,和我們在單鏈表中的鏈式儲存的感覺相似,我們會設定乙個指向棧頂的指標top,同時當top == null時為空棧

}

template void linkstack::push(const t &value)
template t linkstack::pop()
template t linkstack::gettop() const
在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤

如何用棧實現佇列功能以及如何用佇列實現棧功能

棧實現佇列的基本思路 構造兩個棧,其中乙個用來存放存進來的資料,另外乙個用來倒置其中的資料實現輸出。public static class twostacksqueue public void add int pushint public intpoll else if stackpop.empty...

如何用鍊錶實現棧?

棧 stack 又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元...

C語言如何用順序棧實現回文序列判斷

我是採用了兩個棧值得比較大小判斷得 可能比較浪費空間但是 我感覺簡單一點 首先是定義乙個棧的結構元素,由於是字串型別就直接定義乙個char的陣列就可以 typedef struct stack seqstack 下來就是初始化,我這裡是用的耿國華老師的方法就直接給乙個top元素指向棧頂,傳入的指標位...