Day4:数据结构之栈
Posted 雨轩(小宇)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day4:数据结构之栈相关的知识,希望对你有一定的参考价值。
目录 | 目录 |
---|---|
顺序表 | 单链表(不带附加头结点) |
双链表(带附加头结点) | 栈(顺序表实现) |
前言
大家好,上一次我们学习到了双链表,今天我们来学习栈的一些性质和注意事项。
1、栈的定义
- 栈是一种先进后出并且只能在末端进行插入和删除的线性表。允许插入和删除的一端叫栈顶(top),而不允许插入和删除的另一端叫栈底(bottom)。
- 栈一般是用顺序表实现的,因为只考虑在栈顶进行插入和删除,获取也是获取的栈顶元素,不需要考虑其他位置。
2、栈的基本实现
头文件
#pragma once // 防止头文件重复包含
#include<stdio.h>
#include<assert.h> // 断言检查头文件
#include<stdlib.h> // 动态内存函数头文件
#include<stdbool.h> // bool头文件
// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
//typedef int STDataType;
//#define N 10
//typedef struct Stack
//{
// STDataType a[N];
// int top; // 栈顶
//}Stack;
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* a; // 指针形式,可以进行扩容
int top; // 栈顶
int capacity; // 容量
}Stack;
1. 初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
2. 入栈
- 入栈只能在栈顶入栈,这里实现用的是数组,所以是在数组末尾入栈的。
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->top == ps->capacity) // 若顺序表满了,就扩容
{
STDataType newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity; // 设置新容量进行扩容
STDataType* ps1 = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType)); // 给指针ps->a 进行扩容
if (ps1 == NULL) // 检查内存是否分配成功
{
perror("realloc"); // 错误报警信息
exit(-1); // 退出
}
ps->a = ps1; // 申请内存成功,赋给ps->a
ps->capacity = newcapacity; // 容量等于新的容量
}
ps->a[ps->top] = data; // 栈顶赋新值
ps->top++; // 有效个数 +1
}
3. 出栈
- 出栈也是从栈顶出元素,删除栈顶的元素,既为出栈,在这里依然是删除数组末尾的元素即可,所以实现起来比较简单,直接检查栈是否为空,有效个数 -1 即可。
void StackPop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps));// 检查栈是否为空
--ps->top;// 有效个数 -1
}
4. 获取栈顶元素
- 获取栈顶元素,检查栈是否为空,然后返回栈顶元素(末尾元素)即可。
STDataType StackTop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}
5. 检查站中有效个数
- 返回top即可。
int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
6. 检查栈是否为空
- 检测栈是否为空,如果为空返回非零结果,如果不为空返回0。
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->top == 0;
}
7. 销毁栈
- 释放 ps->a,防止内存泄漏。
void StackDestroy(Stack* ps)
{
assert(ps);
if (ps->a) // 检查是否为空,不为空就释放
{
free(ps->a); // 防止内存泄漏
}
ps->a = NULL; // 置空,防止变成野指针
ps->top = 0;
ps->capacity = 0;
}
面试题
学了栈,可以做一道括号匹配题来检验你是否学会了,链接:有效的括号.
扩展
学到这,想必大家都知道栈是比较简单的线性表,但它是一种最常用和最重要的数据结构,用途是非常广泛的。
例如:
- 汇编处理程序中的句法识别和表达式计算就是基于栈实现的。
- 栈还经常使用在函数调用时的参数传递和函数值的返回方面。
下来之后,大家可以自己去了解了解栈的作用哦,这里就不多说了。
源码链接:gitee.
ps:制作不易,记得三连!!!
以上是关于Day4:数据结构之栈的主要内容,如果未能解决你的问题,请参考以下文章