網站首頁 編程語言 正文
今天說的是關于數據結構順序棧的一些基本操作c語言實現。
順序棧的定義
首先,我們先來簡單了解一下順序棧,前面線性表我們知道,根據順序存儲或者鏈式存儲分為順序表和單鏈表,同樣的,根據存儲方式的不同,我們把棧分為順序存儲的棧稱為順序棧,鏈式存儲的棧稱為鏈棧。我們要講的就是順序棧。實際上,有了前面線性表的一些知識后,關于棧的操作我們還是比較容易理解的。
順序棧的理解
問題來了?我們怎么去定義呢?通常我們可以用一個數組和記錄棧頂元素位置的變量組成,棧頂位置用整型變量Top記錄當前棧頂元素的下標值。當Top==-1時,表示空棧。當top==MAXSIZE-1時,表示滿棧。好了,下面開始實現順序棧。
準備工作
1.宏定義及其重命名
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存儲空間初始分配量 */
typedef int Status;
typedef int SElemType; /* SElemType類型根據實際情況而定,這里假設為int */
2.結構體(順序棧的表示方式)
/* 順序棧結構 */
typedef struct
{
SElemType data[MAXSIZE];
int top; /* 用于棧頂指針 */
}SqStack;
具體實現
1.初始化
/* 構造一個空棧S */
Status InitStack(SqStack *S)
{
/* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */
S->top=-1;
return OK;
}
2.清空
/* 把S置為空棧 */
Status ClearStack(SqStack *S)
{
S->top=-1;
return OK;
}
3.判斷是否為空
/* 若棧S為空棧,則返回TRUE,否則返回FALSE */
Status StackEmpty(SqStack S)
{
if (S.top==-1)
return TRUE;
else
return FALSE;
}
4.求長度
/* 返回S的元素個數,即棧的長度 */
int StackLength(SqStack S)
{
return S.top+1;
}
5.求棧頂元素
/* 若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR */
Status GetTop(SqStack S, SElemType* e)
{
if (S.top == -1) {
return ERROR;
}
else {
*e = S.data[S.top];
return OK;
}
}
6.入棧(判斷是否滿了)
/* 插入元素e為新的棧頂元素 */
Status Push(SqStack* S, SElemType e)
{
if (S->top == MAXSIZE - 1) /* 棧滿 */
{
return ERROR;
}
S->top++; /* 棧頂指針增加一 */
S->data[S->top] = e; /* 將新插入元素賦值給棧頂空間 */
return OK;
}
7.出棧(判斷是否為空)
/* 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR */
Status Pop(SqStack* S, SElemType* e)
{
if (S->top == -1)
return ERROR;
*e = S->data[S->top]; /* 將要刪除的棧頂元素賦值給e */
S->top--; /* 棧頂指針減一 */
return OK;
}
8.遍歷
/* 從棧底到棧頂依次對棧中每個元素顯示 */
Status StackTraverse(SqStack S)
{
int i;
i = 0;
while (i <= S.top)
{
visit(S.data[i++]);
}
printf("\n");
return OK;
}
Status visit(SElemType c)
{
printf("%d ", c);
return OK;
}
主函數
int main()
{
int j;
SqStack s;
int e;
if (InitStack(&s) == OK)
for (j = 1; j <= 10; j++)
Push(&s, j);
printf("棧中元素依次為:");
StackTraverse(s);
Pop(&s, &e);
printf("彈出的棧頂元素 e=%d\n", e);
printf("棧空否:%d(1:空 0:否)\n", StackEmpty(s));
GetTop(s, &e);
printf("棧頂元素 e=%d 棧的長度為%d\n", e, StackLength(s));
ClearStack(&s);
printf("清空棧后,棧空否:%d(1:空 0:否)\n", StackEmpty(s));
return 0;
}
好啦,本次順序棧的一些知識就結束了。
原文鏈接:https://blog.csdn.net/weixin_60478154/article/details/123809529
相關推薦
- 2022-10-13 解析django的csrf跨站請求偽造_python
- 2021-12-17 使用遞歸時返回結果是undefined的原因和解決辦法
- 2022-01-18 uniapp實現動態標記效果詳細步驟【前端開發】
- 2022-07-03 YOLOv5中SPP/SPPF結構源碼詳析(內含注釋分析)_python
- 2022-07-10 手動實現function isInstanceOf(child,Parent)
- 2023-01-11 解決?Redis?數據傾斜、熱點等問題_Redis
- 2024-01-31 成功解決 npm ERR! /usr/bin/git ls-remote -h -t git://g
- 2022-05-17 基于Pytorch的神經網絡之Regression的實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支