棧和佇列(一) 棧 建立順序棧演算法庫

2021-07-07 04:27:30 字數 3541 閱讀 4266

/*

*all right resvered .

*檔名稱: 建立順序棧演算法庫.cpp

*作 者: 鄭兆涵

*棧和佇列(一)——棧

*/

問題:順序棧演算法庫採用程式的多檔案組織形式,包括兩個檔案:

①標頭檔案:sqstack.h,包含定義順序棧資料結構的**、巨集定義、要實現演算法的函式的宣告

②原始檔:sqstack.cpp,包含實現各種演算法的函式的定義

程式設計**:

//標頭檔案:sqstack.h,包含定義順序棧資料結構的**、巨集定義、要實現演算法的函式的宣告

#ifndef sqstack_h_included

#define sqstack_h_included

#define maxsize 100

typedef char elemtype;

typedef struct

sqstack; //順序棧型別定義

void initstack(sqstack *&s); //初始化棧

void destroystack(sqstack *&s); //銷毀棧

bool stackempty(sqstack *s); //棧是否為空

int stacklength(sqstack *s); //返回棧中元素個數——棧長度

bool push(sqstack *&s,elemtype e); //入棧

bool pop(sqstack *&s,elemtype &e); //出棧

bool gettop(sqstack *s,elemtype &e); //取棧頂資料元素

void dispstack(sqstack *s); //輸出棧

#endif // sqstack_h_included

//原始檔:sqstack.cpp,包含實現各種演算法的函式的定義

#include #include #include "sqstack.h"

void initstack(sqstack *&s)

void destroystack(sqstack *&s)

int stacklength(sqstack *s) //返回棧中元素個數——棧長度

bool stackempty(sqstack *s)

bool push(sqstack *&s,elemtype e)

bool pop(sqstack *&s,elemtype &e)

bool gettop(sqstack *s,elemtype &e)

void dispstack(sqstack *s) //輸出棧

#include #include "sqstack.h"

int main()

printf("\n");

printf("(8)棧為%s\n",(stackempty(s)?"空":"非空"));

printf("(9)釋放棧\n");

destroystack(s);

return 0;

}

輸出結果:

學習心得:

①棧頂:線性表中允許進行插入、刪除操作的一端。也就是說初始化棧的時候,就會設立乙個指標專門指向棧頂p,而棧在進行插入和刪除的時候,棧頂就是進行所謂操作的那個位置。

②棧底:線性表的另一端為棧底。

③空棧:線性表中沒有元素的時候,或者說剛剛初始化的乙個棧,都是空棧。

④壓棧(進棧):插入操作。對當前棧頂位置進行進棧操作。

⑤退棧(出棧):刪除操作。也是刪除當前棧頂位置元素的操作。

二、棧的順序儲存結構及其基本運算的實現(**分析)

typedef struct

elemtype data[maxsize];

int top;        //定義乙個棧頂指標

}sqstack;           //定義乙個順序棧型別

①通過對棧的大小maxsize進行設定,每個元素都具有同意資料型別即elemtype,其中定義乙個top為棧的棧頂指標,最後再定義乙個順序棧型別sqstack。

②再定義乙個指標s專門取指向順序棧,棧空條件為s->top==-1;棧滿條件為s->top==maxsize-1;元素e的進棧操作和出棧操作都是分別對棧頂元素top進行+1和-1的操作。

(1)void initstack(sqstack *&s);    //初始化棧

建立乙個新的空棧s,實際上是將棧頂指標指向-1即可:

首先對順序棧sqstack分配空間malloc(sizeof(sqstack)),再將它的位址賦值給s,即可得到s指向順序棧,並且top指向-1的位置

(2)void destroystack(sqstack *&s);  //銷毀棧

釋放棧s所占用的儲存空間:

整個棧的儲存,是占用了包含由top=-1這乙個空間和其他棧內空間所構成的整段空間,只需要將s指向的這個順序棧作為乙個結構體整體釋放即可。

(3)bool stackempty(sqstack *s);     //棧是否為空

棧s為空的條件是s->top==-1:

只需要定義乙個布林型變數,來判斷棧頂元素top是否為-1即可,若top==-1則return(true),也就可以判斷出這個棧為空;若top!=-1則return(false),也就可以判斷出這個棧不為空。

(4)int stacklength(sqstack *s);  //返回棧中元素個數——棧長度

直接進行top+1即可,只需要判斷是否滿棧就行。

(5)bool push(sqstack *&s,elemtype e); //入棧

在棧不滿的條件下,先將棧頂指標增1,然後由棧頂指標指向位置插入元素e:

在**中,首先是if語句進行判斷是否滿棧,若滿棧則return(false),則說明在定義的布林型變數中,進棧操作無法進行,此時為棧上溢位,這是因為順序棧的空間是有限的。如果棧不為滿,則自然會進行下一步,s->top++,並且把當前位置s->top所對應的座標中的數s->data賦值給e,此時進棧成功。

(6)bool pop(sqstack *&s,elemtype &e); //出棧

在棧不空的條件下,先將棧頂指標元素賦值給e,然後將棧頂元素指標減1:

在**中,首先是if語句進行判斷是否為空棧,若空棧則return(false),則說明在定義的布林型變數中,出棧操作無法進行,此時為棧下溢位。如果棧不為空,則自然會進行下一步,並且把e賦值給當前位置s->top所對應的座標中的數s->data中,s->top--,此時出棧成功。

(7)bool gettop(sqstack *s,elemtype &e); //取棧頂資料元素

在棧不為空的條件下,將棧頂元素賦值給e。

在**中,首先是if語句進行判斷是否為空棧,若空棧則return(false),則說明在定義的布林型變數中,出棧操作無法進行,此時為棧下溢位。如果棧不為空,則不是棧下溢位,就直接把e賦值給當前位置s->top所對應的座標中的數s->data中,即可。

建立順序棧演算法庫

問題描述 定義順序棧儲存結構,實現其基本運算,並完成測試。輸入描述 無。程式輸出 測試內容。define maxsize 100 typedef char elemtype typedef struct sqstack 順序棧型別定義 void initstack sqstack s 初始化棧 vo...

建立順序棧演算法庫

ifndef sqstack h included define sqstack h included define maxsize 100 typedef char elemtype typedef struct sqstack 順序棧型別定義 void initstack sqstack s 初...

實驗二 棧和佇列 順序棧 順序佇列

棧是什麼?棧是一種結構,也是一種方式。棧代表著 後進先出 我是這麼理解的 如圖 就像是放在試管裡的雞蛋,新放進去的雞蛋肯定是在最上層,想拿走的話只能從最上層乙個個拿,這種方式叫做棧。棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對...