『初阶数据结构 • C语言』⑩ - 栈的概念和实现附完整源码
1.栈的概念及结构
栈存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下 3 条约束。
● 只能在末尾插入数据。
● 只能读取末尾的数据。
● 只能移除末尾的数据。
你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能往上加,不能往中间塞,要拿碟子只能从上面拿,不能从中间拿(至少你不应该这么做)。绝大部分计算机科学家都把栈的末尾称为栈顶,把栈的开头称为栈底。
尽管这些约束看上去令人很拘束,但很快你就会发现它们带来的好处。
我们先从一个空栈开始演示。
往栈里插入数据,也叫作压栈。你可以想象把一个碟子压在其他碟子上的画面。
首先,将 5 压入栈中。
接着,将 3 压入栈中。
再将 0 压入栈中。
注意,每次压栈都是把数据加到栈顶(也就是栈的末尾)。如果想把 0 插入到栈底或中间,那是不允许的,因为这就是栈的特性:只能在末尾插入数据。
从栈顶移除数据叫作出栈。这也是栈的限制:只能移除末尾的数据。
来把栈中的一些数据弹出。
首先,弹出 0。
接着,弹出 3。
这就剩下 5了。
总结:
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
2.栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
2.1栈的结构定义
-
typedef int STDataType;
-
-
typedef struct Stack
-
{
-
STDataType* a; //动态开辟数组
-
int capacity; //记录栈的容量大小
-
int top; //记录栈顶的位置
-
}Stack;
2.2函数接口的实现
首先是在Stack.h文件中进行函数声明
Stack.h
-
-
-
-
-
-
-
typedef int STDataType;
-
-
typedef struct Stack
-
{
-
STDataType* a; //动态开辟数组
-
int capacity; //记录栈的容量大小
-
int top; //记录栈顶的位置
-
}Stack;
-
-
//栈的初始化
-
void StackInit(Stack* ps);
-
//释放动态开辟的内存
-
void StackDestroy(Stack* ps);
-
//压栈
-
void StackPush(Stack* ps, STDataType data);
-
//出栈
-
void StackPop(Stack* ps);
-
//读取栈顶的元素
-
STDataType StackTop(Stack* ps);
-
//判断栈是否为空
-
bool StackEmpty(Stack* ps);
-
//栈存储的数据个数
-
int StackSize(Stack* ps);
在Stack.c文件中进行函数的定义
Stack.c
-
-
-
-
void StackInit(Stack* ps)
-
{
-
assert(ps);
-
//初始化时,可附初值,也可置空
-
ps->a = NULL;
-
ps->capacity = 0;
-
ps->top = 0;
-
}
-
-
void StackDestroy(Stack* ps)
-
{
-
assert(ps);
-
//若并未对ps->a申请内存,则无需释放
-
if (ps->capacity == 0)
-
return;
-
//释放
-
free(ps->a);
-
ps->a = NULL;
-
ps->capacity = ps->top = 0;
-
}
-
-
void StackPush(Stack* ps,STDataType data)
-
{
-
assert(ps);
-
//若容量大小等于数据个数,则说明栈已满,需扩容
-
if (ps->capacity == ps->top)
-
{
-
//若为第一次扩容,则大小为4,否则每次扩大2倍
-
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
-
STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
-
if (tmp == NULL)
-
{
-
perror("realloc fail");
-
exit(-1);
-
}
-
-
ps->a = tmp;
-
ps->capacity = newCapacity;
-
}
-
//压栈
-
ps->a[ps->top] = data;
-
ps->top ;
-
}
-
-
void StackPop(Stack* ps)
-
{
-
assert(ps);
-
assert(!StackEmpty(ps));
-
//出栈
-
ps->top--;
-
}
-
-
STDataType StackTop(Stack* ps)
-
{
-
assert(ps);
-
assert(!StackEmpty(ps));
-
//返回栈顶的数据
-
return ps->a[ps->top - 1];
-
}
-
-
bool StackEmpty(Stack* ps)
-
{
-
assert(ps);
-
//返回top
-
return ps->top == 0;
-
}
-
-
int StackSize(Stack* ps)
-
{
-
assert(ps);
-
return ps->top;
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgggebk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13