網(wǎng)站首頁(yè) 編程語言 正文
數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記——順序存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)棧
作者:晚風(fēng)(●?σ ) 更新時(shí)間: 2022-05-13 編程語言目錄
- 一、棧的相關(guān)知識(shí)
- 二、順序棧的定義
- 三、順序棧的初始化
- 四、判斷順序棧是否為空棧
- 五、判斷順序棧是否為滿棧
- 六、進(jìn)棧(插入操作)
- 七、出棧(刪除操作)
- 八、讀取順序棧頂元素
- 九、順序棧的建立
- 一個(gè)簡(jiǎn)單的順序棧的基本實(shí)現(xiàn)例子
- 十、棧的遍歷輸出
一、棧的相關(guān)知識(shí)
- 棧是一種只允許在一端進(jìn)行插入或刪除操作的線性表,它是一種
特殊的線性表
,其遵循的原則是先進(jìn)后出
(FILO),即后進(jìn)的元素先被取出來。由于它是一種線性表,所以有兩種方式:順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示,即順序棧
和鏈?zhǔn)綏?/code>。
其中,棧的插入操作稱為進(jìn)棧
,棧的刪除操作稱為出棧
。
二、順序棧的定義
通過一組數(shù)組地址的連續(xù)的存儲(chǔ)單元來存放從棧底開始至棧頂?shù)臄?shù)據(jù)元素,同時(shí)設(shè)置一個(gè)棧頂指針top,用于指示當(dāng)前棧頂元素的位置
,代碼如下:
#define MaxSize 20//可自行設(shè)置
typedef struct {
int data[MaxSize];//存放棧中元素 ,使用數(shù)組
int top;//棧頂指針 ,記錄棧頂元素的位置
} SqStack;//順序棧的類型定義
我們可以得到,由于c語言中數(shù)組的下標(biāo)是從0開始的,所以棧的總長(zhǎng)度為S.top+1
,即要加1。
三、順序棧的初始化
初始化一個(gè)順序棧,這里的參數(shù)SqStack &S,帶有“&”,表示引用調(diào)用,即對(duì)參數(shù)的修改結(jié)果進(jìn)行帶回,棧頂指針為S.top
,棧頂元素的值為S.data[S.top]
,初始化時(shí)定義S.top=-1
表示順序棧為空,而當(dāng)S.top=0
時(shí),表示棧中只存在一個(gè)元素,代碼如下:
/*順序棧的初始化,初始化一個(gè)空棧*/
void InitStack(SqStack &S) {
S.top=-1;//順序棧為空
}
四、判斷順序棧是否為空棧
可以得到,判斷順序棧是否為空棧的條件是S.top==-1
,表示此時(shí)順序棧中為空棧
,無任何元素,代碼如下:
/*判斷順序棧是否為空*/
bool StackEmpty(SqStack S) {
if(S.top==-1)//當(dāng)top=-1時(shí),棧為空,而并不是S.top=0(它表示的是棧中有一個(gè)元素).
return true;
else
return false;
}
五、判斷順序棧是否為滿棧
判斷順序棧是否為空棧的條件是S.top==MaxSize-1
,由于c語言數(shù)組下標(biāo)從0開始的,棧中元素最大個(gè)數(shù)MaxSize要減1,即當(dāng)top=MaxSize-1時(shí),表示此時(shí)順序棧中已滿,無法再存入元素,代碼如下:
/*判斷順序棧是否為滿棧*/
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)//由于c語言數(shù)組下標(biāo)從0開始的,即當(dāng)top=MaxSize-1時(shí),此時(shí)棧滿。
return true;
else
return false;
}
六、進(jìn)棧(插入操作)
將一個(gè)元素插入順序棧中,即進(jìn)棧,由于進(jìn)棧后元素個(gè)數(shù)有變化,所以要用引用“&”,即SqStack &S,首先判斷順序棧是否已滿,然后在新的元素進(jìn)棧前,所以棧頂指針要先加1,即++S.top
,然后將進(jìn)棧元素的值傳入并將其入棧,如下:
++S.top;//top指針始終指向棧頂,新的元素進(jìn)棧,所以指針先加1
S.data[S.top]=x;//將進(jìn)棧元素的值傳入并入棧
這兩行代碼也可以使用一行代碼:S.data[++S.top]=x
直接替換。
進(jìn)棧操作的完整代碼如下:
/*進(jìn)棧操作*/
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)//若棧已滿,則報(bào)錯(cuò)
return false;
++S.top;//top指針始終指向棧頂,新的元素進(jìn)棧,所以指針先加1
S.data[S.top]=x;//將進(jìn)棧元素的值傳入并入棧
//S.data[++S.top]=x;
return true;
}
七、出棧(刪除操作)
將一個(gè)元素從順序棧中刪除,即出棧,由于棧的特性,只能先進(jìn)后出,即從棧頂進(jìn)行刪除操作然后依次,同樣出棧后元素個(gè)數(shù)有變化,所以要用引用“&”,即SqStack &S,首先判斷順序棧是否為空,元素出棧后(將棧頂元素賦給x),然后棧頂指針要減1,如下:
x=S.data[S.top];//出棧
S.top--;//指針減1
這兩行代碼也可以使用一行代碼:x=S.data[S.top--]
直接替換。
出棧操作的完整代碼如下:
/*出棧操作*/
bool StackPop(SqStack &S,int x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//出棧
S.top--;//指針減1
//x=S.data[S.top--];
return true;
}
八、讀取順序棧頂元素
讀取順序棧頂元素,這里并沒有將棧頂元素取出(無出棧操作),首先判斷當(dāng)前順序棧是否為空,然后通過x來記錄棧頂元素,如下:
/*讀取棧頂元素*/
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//x記錄棧頂元素
return true;
}
九、順序棧的建立
順序棧的建立中輸入一個(gè)值代表要?jiǎng)?chuàng)建的棧的元素個(gè)數(shù),然后通過一個(gè)for循環(huán)建立順序棧,其中使用到棧的進(jìn)棧操作,每次向棧中插入元素,代碼如下:
/*棧的建立*/
void CreateStack(SqStack &S,int x){
int number;
printf("請(qǐng)輸入要建立棧的元素個(gè)數(shù):\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("輸入第%d個(gè)入棧的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
一個(gè)簡(jiǎn)單的順序棧的基本實(shí)現(xiàn)例子
例如,創(chuàng)建一個(gè)順序棧,棧中元素從棧底到棧頂依次為1,2,3,4,5,第一步首先輸出當(dāng)前棧頂元素;第二步通過用戶輸入一個(gè)要進(jìn)棧的元素“6”,并輸出進(jìn)棧后此時(shí)的棧頂元素;第三步通過執(zhí)行一次出棧操作后,然后再輸出此時(shí)的棧頂元素。
實(shí)現(xiàn)代碼如下:
#include
#define MaxSize 20//可自行設(shè)置
typedef struct {
int data[MaxSize];//存放棧中元素 ,使用數(shù)組
int top;//棧頂指針 ,記錄棧頂元素的位置
} SqStack;//順序棧的類型定義
/*順序棧的初始化,初始化一個(gè)空棧*/
void InitStack(SqStack &S) {
S.top=-1;//順序棧為空
}
/*判斷順序棧是否為空*/
bool StackEmpty(SqStack S) {
if(S.top==-1)//當(dāng)top=-1時(shí),棧為空,而并不是S.top=0(它表示的是棧中有一個(gè)元素).
return true;
else
return false;
}
/*判斷順序棧是否為滿棧*/
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)//由于c語言數(shù)組下標(biāo)從0開始的,即當(dāng)top=MaxSize-1時(shí),此時(shí)棧滿。
return true;
else
return false;
}
/*進(jìn)棧操作*/
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)//若棧已滿,則報(bào)錯(cuò)
return false;
++S.top;//top指針始終指向棧頂,新的元素進(jìn)棧,所以指針先加1
S.data[S.top]=x;//將進(jìn)棧元素的值傳入并入棧
//S.data[++S.top]=x;
return true;
}
/*出棧操作*/
bool StackPop(SqStack &S,int x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//出棧
S.top--;//指針減1
//x=S.data[S.top--];
return true;
}
/*讀取棧頂元素*/
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//x記錄棧頂元素
return true;
}
/*棧的建立*/
void CreateStack(SqStack &S,int x) {
int number;
printf("請(qǐng)輸入要建立棧的元素個(gè)數(shù):\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("輸入第%d個(gè)入棧的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
/*主函數(shù)*/
int main() {
SqStack S;
int x,e;
InitStack(S);//初始化
CreateStack(S,x);//創(chuàng)建順序棧
StackGetTop(S,x);//讀取棧頂元素
printf("讀取棧頂元素,當(dāng)前棧頂元素為:%d\n",x);
printf("輸入一個(gè)要進(jìn)棧的元素:");
scanf("%d",&e);
StackPush(S,e);//進(jìn)棧
StackGetTop(S,x);
printf("讀取棧頂元素,當(dāng)前棧頂元素為:%d\n",x);
StackPop(S,x);//出棧
StackGetTop(S,x);
printf("執(zhí)行一次出棧操作后,當(dāng)前棧頂元素為:%d",x);
}
運(yùn)行結(jié)果如下:
十、棧的遍歷輸出
首先判斷順序棧是否為空,然后通過while循環(huán),當(dāng)S.top!=-1時(shí)一直執(zhí)行下去,每次輸出棧頂?shù)脑兀缓笤贉p1,如下代碼:
/*棧的遍歷輸出*/
bool PrintStack(SqStack S,int x){
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
while(S.top!=-1){
x=S.data[S.top--];
printf("%d ",x);
}
return true;
}
例如,下列代碼:
#include
#define MaxSize 20//可自行設(shè)置
typedef struct {
int data[MaxSize];//存放棧中元素 ,使用數(shù)組
int top;//棧頂指針 ,記錄棧頂元素的位置
} SqStack;//順序棧的類型定義
/*順序棧的初始化,初始化一個(gè)空棧*/
void InitStack(SqStack &S) {
S.top=-1;//順序棧為空
}
/*判斷順序棧是否為空*/
bool StackEmpty(SqStack S) {
if(S.top==-1)//當(dāng)top=-1時(shí),棧為空,而并不是S.top=0(它表示的是棧中有一個(gè)元素).
return true;
else
return false;
}
/*判斷順序棧是否為滿棧*/
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)//由于c語言數(shù)組下標(biāo)從0開始的,即當(dāng)top=MaxSize-1時(shí),此時(shí)棧滿。
return true;
else
return false;
}
/*進(jìn)棧操作*/
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)//若棧已滿,則報(bào)錯(cuò)
return false;
++S.top;//top指針始終指向棧頂,新的元素進(jìn)棧,所以指針先加1
S.data[S.top]=x;//將進(jìn)棧元素的值傳入并入棧
//S.data[++S.top]=x;
return true;
}
/*出棧操作*/
bool StackPop(SqStack &S,int x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//出棧
S.top--;//指針減1
//x=S.data[S.top--];
return true;
}
/*讀取棧頂元素*/
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
x=S.data[S.top];//x記錄棧頂元素
return true;
}
/*棧的建立*/
void CreateStack(SqStack &S,int x) {
int number;
printf("請(qǐng)輸入要建立棧的元素個(gè)數(shù):\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("輸入第%d個(gè)入棧的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
/*棧的遍歷輸出*/
bool PrintStack(SqStack S,int x){
if(S.top==-1)//若棧為空,則報(bào)錯(cuò)
return false;
while(S.top!=-1){
x=S.data[S.top--];
printf("%d ",x);
}
return true;
}
/*主函數(shù)*/
int main() {
SqStack S;
int x;
InitStack(S);//初始化
CreateStack(S,x);//創(chuàng)建順序棧
StackGetTop(S,x);//讀取棧頂元素
printf("讀取棧頂元素,當(dāng)前棧頂元素為:%d\n",x);
printf("從棧頂?shù)綏5椎脑兀ǔ鰲m樞颍┮来螢椋?);
PrintStack(S,x); //遍歷輸出棧中元素
}
運(yùn)行結(jié)果如下:
原文鏈接:https://blog.csdn.net/qq_43085848/article/details/124575864
相關(guān)推薦
- 2022-06-18 SpringBoot打包docker鏡像發(fā)布的詳細(xì)步驟_docker
- 2024-03-06 SpringAOP基于注解方式實(shí)現(xiàn)和細(xì)節(jié)
- 2022-09-21 Android開發(fā)之AAR文件的生成與使用步驟_Android
- 2022-02-13 使用filter過濾器計(jì)算數(shù)組中符合條件的長(zhǎng)度
- 2022-04-14 Python+Tkinter簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄功能_python
- 2022-03-15 nginx 請(qǐng)求的時(shí)候 500錯(cuò)誤 failed (13: Permission denied)
- 2022-06-08 記一次網(wǎng)站全站http升級(jí)為https的過程,websocket : ws升級(jí)為wss遇到的問題等
- 2022-10-03 iOS開發(fā)KVO實(shí)現(xiàn)細(xì)節(jié)解密_IOS
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支