C 中棧結構建立與操作詳細解析

2022-10-04 04:39:13 字數 4406 閱讀 4135

什麼是棧結構

棧結構是從資料的運算來分類的,也就是說棧結構具有特殊的運算規則,即:後進先出。

我們可以把棧理解成乙個大倉庫,放在倉庫門口(棧頂)的貨物會優先被取出,然後再取出裡面的貨物。

而從資料的邏輯結構來看,棧結構起始就是一種線性結構。

如果從資料的儲存結構來進一步劃分,棧結構包括兩類:

順序棧結構:

即使用一組位址連續的記憶體單元依次儲存棧中的資料。在程式中,可以定義乙個指定大小的結構陣列來作為棧,序號為0的元素就是棧低,再定義乙個變數top儲存棧頂的序號即可。

鏈式棧結構:

即使用鍊錶的的形式儲存棧中各元素的值。鍊錶首部(head指標所指向元素)為棧頂,鍊錶尾部(指向位址為null)為棧底。

在棧結構中只能在一端進行操作,該操作端稱為棧頂,另一端稱為棧底。也就是說,儲存和取出的資料都只能從棧結構的一端進行。從資料的運算角度來分析,棧結構是按照「後進先出」的原則處理結點資料的。

在棧結構中,只有棧頂元素是可以訪問的,棧結構的資料運算也是非常簡單。一般棧結構的基本操作只有兩個:

入棧(push):將資料儲存到棧頂的操作。進行入棧操作前,先修改棧頂指標,使其向上移乙個元素位置,然後將資料儲存到棧頂指標所指的位置。

出棧(pop):將棧頂資料彈出的操作。通過修改棧頂指標,使其指向棧中的下乙個元素。

接下來,我們使用c++語言建立順序棧,並完成順序棧結構的基本運算

準備資料

準備在棧操作中需要用到的變數及資料結構等。

複製** **如下:

#define maxlen 50

struct data

;struct stacktype

;定義棧結構的長度maxlen,棧結構的資料元素型別data,以及棧結構的資料結構stacktype。在資料結構stacktype中,data為資料元素,top為棧頂的序號。當top=0時,表示棧為空,當top=maxlen時表示棧滿。

陣列元素都是充下標0開始的,這裡為了講述和理解方便,我們從下標1開始記錄資料結點,下標0的位置不用。

初始化棧結構

在使用棧結構之前,首先需要建立乙個空的順序棧,也就是初始化順序棧。順序棧的初始化操作如下:

(1)按照符號常量maxlen指定大小申請一片記憶體空間,用來儲存棧中的資料

(2)設定棧頂指標的值為0,表示乙個空棧。

示例**如下:

複製** **如下:

stacktype *stinit()

return null; 

}首先用new申請記憶體,然後設定棧頂為0,然後返回申請記憶體的首位址,申請失敗返回null;

判斷空棧

判斷棧結構是否為空,如果是空棧,則表示該棧結構中沒有資料,此時可以進行入棧操作,但是不可以進行出棧操作。

示例**如下:

複製** **如下:

int stisempty(stacktype *s)

輸入引數s為乙個指向操作的棧的指標。根據棧頂指標top判斷是否為0,判斷棧是否為空。

判斷滿棧

判斷棧結構是否為滿。如果是滿棧,則表示該棧結構中沒有多餘的空間來儲存額外資料。此時不可以進行入棧操作,但是可以進行進棧操作。

示例**如下:

複製** **如下:

int stisfull(stacktype *s)

輸入引數s為乙個指向操作的棧的指標。根據棧頂指標top判斷是否和maxlen相等,判斷棧是否已滿。

清空棧清空棧就是棧中所有的資料被清除。 示例**如下:

複製** **如下:

void stclear(stacktype *s)

將棧頂指標top設定為0,表示執行清空棧操作。(這裡只是邏輯上將棧中資料清空,實際上只是將top設定為0,以後再新增資料會覆蓋原來的資料)

釋放空間

釋放空間是釋放棧結構所占用的記憶體單元,使用delete釋放用new運算子申請的記憶體空間。

示例**如下:

複製** **如下:

void stfree(stacktype *s)

在程式中直接呼叫delete運算子釋放已分配的記憶體空間。一般在不需要使用棧結構時呼叫該函式,特別是在程式結束的時候。

入棧入棧(push)是棧結構的基本操作,主要操作是將資料元素儲存到棧結構。入棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top大於等於maxlen,則表示溢位,進行出錯處理。否則執行以下操作。

(2)設定top=top+1(棧頂指標加1,指向入棧位址)

(3)將入棧呀u尿素儲存到top指向的位置。

示例**如下:

複製** **如下:

int pushst(stacktype *s,data data)

s->data[++s->top]=data;     //將元素壓入棧

return 1;

}輸入引數s為乙個指向操作的棧的指標,輸入引數data是需要入棧的資料元素。程式首先判斷棧是否溢位,如果溢位就給出警告,不進行入棧操作,否則修改棧頂指標,即top先加1,然後將data放到top現在指向的資料單元。

出棧出棧(pop)是佔據誒狗的基本操作,主要操作與入棧相反,它是從棧頂彈出乙個資料元素,出棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top等於0,則表示為恐慌在哪,進行出錯處理。否則執行下面的操作。

(2)將棧頂指標top所指向的位置的元素返回(實際是返回的指標)

(3)將top的減1,指向棧的下乙個元素,原來棧頂的元素被彈出。

複製** **如下:

data * popst(stacktype *s)

return &(s->data[s->top--]);

} 當棧中有資料時,該函式返回值是乙個指向data型別資料的指標。

讀取點結構

讀取點結構也就是讀取棧結構中結點的資料。由於棧結構只能在一端進行操作,因此這裡的讀操作其實就是讀站點的資料。

需要注意的是,讀節點資料的操作和出棧操作不同。讀結點操作僅僅是顯示棧頂結點資料的內容,而出棧操作則將棧頂資料彈出。

示例**如下:

複製** **如下:

data *peekst(stacktype *s)

return &(s->data[s->top]);

}對比出棧的示例**,不難發現讀取點結構同樣返回了棧頂結點的位址,但是卻沒有使top減1.

完整示例

下面是棧的基本操作的完整示例:

程式**:

複製** **如下:

#include

#include

using namespace std;

#define maxlen 50

struct data

;struct stacktype

;/******************初始化棧結構****************/

stacktype *stinit()

return null; 

}/****************判斷空棧**********************/

int stisempty(stacktypltqczvyksze *s)

/******www.cppcns.com****************判斷滿棧****************/

int stisfull(stacktype *s)

/**********************清空棧**********************/

void stclear(stacktype *s)

/********************釋放空間********************/

void stfree(stacktype *s)

/**********************入棧***********************/

int pushst(stacktype *s,data data)

s->data[++s->top]=data;     //將元素壓入棧

return 1;

}/************************出棧***********************/

data * popst(stacktype *s)

return &(s->data[s->top--]);

} /**********************讀取點結構*******************/

data *peekst(stacktype *s)

return &(s->data[s->top]);

}/*****************進入主函式**********************/

int main()

else

}p_data=pops

cout

cout

stfree(stack);

return 0;

} 程式執行介面:

本文標題: c++中棧結構建立與操作詳細解析

本文位址:

C 中棧結構建立和操作

棧結構是從資料的運算來分類的,也就是說棧結構具有特殊的運算規則,即 後進先出。我們可以把棧理解成乙個大倉庫,放在倉庫門口 棧頂 的貨物會優先被取出,然後再取出裡面的貨物。而從資料的邏輯結構來看,棧結構起始就是一種線性結構。如果從資料的儲存結構來進一步劃分,棧結構包括兩類 即使用一組位址連續的記憶體單...

C 中物件的賦值與複製操作詳細解析

物件的賦值 如果對乙個類定義了兩個或多個物件,則這些同類的物件之間可以互相賦值,或者說,乙個物件的值可以賦給另乙個同類的物件。這裡所指的物件的值是指物件中所有資料成員的值。物件之間的賦值也是通過賦值運算子 進行的。本來賦值運算子 只能用來對單個的變數賦值,現在被擴充套件為兩個同類物件之間的賦值,這是...

資料結構 超詳細!建立鏈棧及其基本操作(C語言)

鏈棧顧名思義就是用把鍊錶改造一下,用於實現棧。棧的核心要點 1.怎麼實現棧先進先出的特性?這個特性用單鏈表來實現,那就只在單鏈表的一端插入或刪除單元即可。比如把尾節點當作棧底,往尾節點前面插入或者刪除元素。2.怎麼體現壓棧操作?需要儲存資料的時候,建立新單元儲存這個資料並鏈結到已建立的鍊錶上。3.怎...