什们叫做栈
-
栈的概念
-
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈的功能
- 只允许栈顶,出去和进来元素,栈底不允许进来和出去元素,所以符合先进后出,后进先出
栈的实现
-
我们用什们实现栈呢?
-
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
也就是我们的顺序表,我们顺序表的尾插实现和简单,但是头插复杂。
为什们我们不用链表呢?因为我们单链表的尾插还得找尾才能插入呢,有点复杂所以不用。但是单链表的头插简单,我们可以利用头插,也就是让头充当栈顶,来进行插入删除。
所以顺序表和链表都是可以的,大家按照需求自己选择,我们利用顺序表,也就是数组实现栈。
数组栈的编写
和之前一样,我们的编写还是写三个问价
Stack.h
:用来编写栈的头文件。
Stack.c
:用来编写栈的函数
test.c
:测试栈的功能。
(1)栈的结构体
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int capacity;
int top;//表示栈顶
}ST;
(2)栈的初始化
//栈的初始化
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
这样初始化其实可以的,只不过在插入的时候,我们需要加空间和扩容,但是我想直接给他4位置的空间。
//栈的初始化
void StackInit(ST* ps)
{
assert(ps);
ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
if (ps->a == NULL)
{
perror("malloc error");
exit(-1);
}
ps->scapacity = 4;
ps->top = 0;
}
(3)栈的销毁
//栈的销毁
void StackDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
(4)栈的插入<在栈顶插入>
在这里就涉及到一个问题,
如果top
初始化为0
,就指向栈顶的下一个元素
如果top
初始化为-1
,就指向栈顶的元素
//栈的插入
void StackPush(ST* ps, STDataType x)
{
assert(ps);
//扩容
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity * 2;
STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);
if (ret == NULL)
{
perror("realloc error");
exit(-1);
}
ps->a = ret;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
(5)栈的删除<在栈顶删除>
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
(6)栈是否为空
//判断栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
if (ps->top == 0)
{
return true;
}
else
{
return false;
}
}
或者变得简单一点,直接返回判断值,让编译器自己判断
//判断栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->top == 0;
}
(7)取栈顶的数据
//取栈顶的元素
STDataType StackTop(ST* ps)
{
assert(ps);
//返会top下一个元素
return ps->a[ps->top - 1];
}
(8)栈的sz
//看栈的大小
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
总结
如果你将顺序表理解的透彻了,那么这是非常简单的,里面的函数也是相当容易的。大家多多练习