数据结构 栈的简单理解和基本操作
Posted 林慢慢i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 栈的简单理解和基本操作相关的知识,希望对你有一定的参考价值。
前言:本章介绍的主要内容是数据结构中栈的概念和栈的基本操作,包括:栈结构的定义、初始化、容量检查、判空、入栈、出栈、读取栈顶元素、读取栈内元素个数、栈的销毁等操作的具体实现。
文章目录
1.为什么需要栈?
1.1栈的概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。**栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。
2.栈项目文件搭建
程序名 | 功能 |
---|---|
Stack.h | 定义结构体,引头文件,函数的声明 |
Stack.c | 各个功能函数的定义 |
test.c | 测试函数功能 |
栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除,后下文将逐一实现。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。
2.1 栈结构的代码实现
typedef int STDataType;
typedef struct Stack
{
STDataType* data; //接收动态开辟的数组地址
int top; //栈顶
int capacity; //容量
}ST;
2.2 栈的初始化
就是初始化成空栈,把
data
指针置为NULL
,top
和capacity
初始化为0.
void StackInit(ST* ps)
{
assert(ps); //传进来的地址一定不能为空
ps->data = NULL;
ps->top = ps->capacity = 0;
}
2.3 栈的检查容量操作
当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。
提问:怎么判断容量满了呢?
答案:
ps->top == ps->capacity
.
void StackCheckCapacity(ST* ps)
{
assert(ps); //ps不可为空
if(ps->top == ps->capacity)
{
//注意细节,如果此时容量为0,就给4个,否则就翻倍
int newcapacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity );
STDataType* newdata = (STDataType*)realloc(ps->data,newcapacity*sizeof(STDataType));
if(newdata == NULL)
{
perror("错误原因:");
exit(-1);
}
ps->data = newdata; //重新交接给ps->data
ps->capacity = newcapacity;
}
}
2.4 栈的判空操作
当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。
void StackPush(ST* ps,STDataType elem)
{
assert(ps); //ps不能为空
return ps->top == 0; //等于0就返回1,
}
2.5 栈的入栈操作
入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。
void StackPush(ST* ps,STDataType elem)
{
assert(ps);
StackCheckCapacity(ps); //检查容量是否满了
ps->data[ps->top++] = elem;
}
2.6 栈的出栈操作
出栈时我们首先要判断栈是否为空栈,然后只需要
ps->top
减去1就行。
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
2.7 栈的读取元素数量操作
直接把
ps->top
的值返回
size_t StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
2.8 栈的读取栈顶操作
直接通过
ps->top-1
把值返回
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->data[ps->top - 1];
}
2.9 栈的销毁操作
直接free
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->data);
//当ps->data是NULL时候,free什么都不会做
ps->data = NULL;
ps->top = ps->capacity = 0;
}
3.源码链接
数据结构的栈内容到此设计结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。
以上是关于数据结构 栈的简单理解和基本操作的主要内容,如果未能解决你的问题,请参考以下文章