Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
@大熊_
LearningDataStructure-Algorithm
提交
261c8579
LearningDataStructure-Algorithm
项目概览
@大熊_
/
LearningDataStructure-Algorithm
通知
4
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
LearningDataStructure-Algorithm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
261c8579
编写于
10月 29, 2020
作者:
@大熊_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
顺序栈
上级
0481fdd8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
120 addition
and
0 deletion
+120
-0
SeqStack.c
SeqStack.c
+120
-0
未找到文件。
SeqStack.c
0 → 100644
浏览文件 @
261c8579
/*
* @Description: 链栈
* @Author: 大熊人
* @Date: 2020-10-26 17:26:52
* @LastEditTime: 2020-10-29 00:03:16
*/
#include <stdio.h>
#include <stdlib.h>
#include "includes/SeqStack.h"
/**
* @description: 初始化顺序栈
* @param {struct *}S
* @return {int}
*/
int
InitStack
(
SeqStack
*
S
)
{
/*
小白笔记:
S必须是一个结构体指针才能完成栈的初始化 因为如果只是结构体变量的话 那么它就是一个形参(局部变量)
局部变量的改变是不会影响到函数间同名变量的改变的 因此我们需要传结构体变量S的地址
简单理解就是通过S的地址 修改结构体成员变量 入栈 出栈 都一样
*/
//申请内存空间后 S->base指向一段可用内存起始地址 大小为SEQSTACK_MAX*4字节 以4字节为一个单位连续的空间 一段一段的
S
->
base
=
(
STACK_DATA_TYPE
*
)
malloc
(
SEQSTACK_MAX
*
sizeof
(
STACK_DATA_TYPE
));
if
(
!
S
->
base
)
{
return
FALSE
;
//申请内存空间失败
}
S
->
top
=
S
->
base
;
S
->
stacksize
=
SEQSTACK_MAX
;
return
TRUE
;
}
/**
* @description: 入栈
* @param {struct *}S
* @param {STACK_DATA_TYPE}X
* @return {int}
*/
int
Push
(
SeqStack
*
S
,
STACK_DATA_TYPE
X
)
{
STACK_DATA_TYPE
*
temp
;
temp
=
S
->
base
;
//用于保护原来的数据
//当栈满时 则增加内存空间 初始化时申请的内存是以4字节为一个单位的内存空间
//例如S->base指向1 S->top指向101 那么S->top - S->base = 100 即栈满
if
(
S
->
top
-
S
->
base
>=
S
->
stacksize
)
{
//按照S->stacksize + ADD_SIZE大小申请新的内存空间,将原有数据拷贝到新的内存空间后并释放原有的内存空间(内存是自动释放的)
//最后返回新申请内存空间的首地址 realloc函数的详细解释->百度
temp
=
(
STACK_DATA_TYPE
*
)
realloc
(
S
->
base
,
(
S
->
stacksize
+
ADD_SIZE
)
*
sizeof
(
STACK_DATA_TYPE
));
if
(
!
temp
)
{
return
FALSE
;
//内存追加失败
}
S
->
base
=
temp
;
S
->
top
=
S
->
base
+
S
->
stacksize
;
//重置栈顶指针指向新的地址
S
->
stacksize
+=
ADD_SIZE
;
//更新顺序栈的长度
}
*
S
->
top
++
=
X
;
//元素入栈 可拆分成:*S->top = X; S->top++;
return
TRUE
;
}
/**
* @description: 获取栈顶元素
* @param {struct *}S
* @param {STACK_DATA_TYPE *}X
* @return {int}
*/
int
GetTop
(
SeqStack
*
S
,
STACK_DATA_TYPE
*
X
)
{
if
(
S
->
stacksize
==
0
)
{
return
FALSE
;
}
*
X
=
*
(
S
->
top
-
1
);
return
TRUE
;
}
/**
* @description: 出栈
* @param {struct *}S
* @param {STACK_DATA_TYPE *}X
* @return {int}
*/
int
Pop
(
SeqStack
*
S
,
STACK_DATA_TYPE
*
X
)
{
if
(
S
->
top
==
S
->
base
)
return
FALSE
;
//空
*
X
=
*--
S
->
top
;
//*(--(S->top))
return
TRUE
;
}
/**
* @description: 测试顺序栈
*/
void
TestSeqStack
()
{
SeqStack
S
;
STACK_DATA_TYPE
value
;
int
i
;
if
(
InitStack
(
&
S
))
printf
(
"初始化成功!
\n
"
);
else
printf
(
"初始化失败!
\n
"
);
for
(
i
=
1
;
i
<=
5
;
i
++
)
{
printf
(
"Push:%d %s
\n
"
,
i
,
Push
(
&
S
,
i
)
?
"入栈成功"
:
"入栈失败"
);
}
GetTop
(
&
S
,
&
value
);
printf
(
"Top:%d
\n
"
,
value
);
while
(
Pop
(
&
S
,
&
value
))
{
printf
(
"Pop:%d "
,
value
);
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录