栈
定义
栈(Stack)是一种特殊的线性表,是后进先出(LIFO,Last In First Out)的数据结构。这意味着最后一个进入栈的元素会最先被弹出。栈通常有两个主要操作:压栈(push)和弹栈(pop)。压栈操作将元素放入栈顶,而弹栈操作将栈顶元素移除并返回。栈还支持查看栈顶元素但不移除的操作(peek)。
栈的应用
- 栈是一种相对简易的数据结构,他的应用领域十分广泛,包括以下方面:
1.函数调用:在C语言中,函数和局部变量是在栈空间中维护的,函数的调用会用到各种压栈和弹栈的操作,例如传参过程就是在函数栈顶压栈。
2.括号的匹配,在处理字符串中的括号匹配问题时,我们可以使用栈来检查每个括号是否与他的配对括号匹配
3.ctrl z撤回等操作
4.双端队列
5.解决 多皇后问题
- 以上只是栈用法的冰山一角,更多用法还请读者以探索的眼光取寻找!!
栈的基本功能及实现
- 栈作为线性表的一种,他的实现方式有多种,包括数组栈和链表栈,这里演示数组栈的实现,若想实现链表栈,推荐使用单链表实现。
初始化和销毁
- 创建一个栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
- 初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = -1;
}
- 销毁
void StackDestroy(Stack* ps)
{
free(ps->_a);
ps->_a == NULL;
ps->_capacity = 0;
ps->_top = -1;
}
压栈和弹栈
- 压栈
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_top + 1 == ps->_capacity)
{
int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(Stack));
if (!tmp)
{
perror("realloc fail!");
return;
}
ps->_a = tmp;
ps->_capacity = newcapacity;
}
ps->_a[++ps->_top] = data;
}
- 弹栈
void StackPop(Stack* ps)
{
assert(ps && ps->_top != -1);
ps->_top--;
}
获取栈顶元素
STDataType StackTop(Stack* ps)
{
return ps->_a[ps->_top];
}
判断栈是否为空以及返回栈的有效数据个数
- 判空
int StackEmpty(Stack* ps)
{
return ps->_top + 1;
}
- 返回有效数据个数
int StackSize(Stack* ps)
{
return ps->_top + 1;
}
- 以上就是这期栈(C语言)的全部内容了,回见!