/*
*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 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對...