Day4:数据结构之栈

Posted 雨轩(小宇)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day4:数据结构之栈相关的知识,希望对你有一定的参考价值。

目录目录
顺序表单链表(不带附加头结点)
双链表(带附加头结点)栈(顺序表实现)

前言

大家好,上一次我们学习到了双链表,今天我们来学习栈的一些性质和注意事项

1、栈的定义

  1. 栈是一种先进后出并且只能在末端进行插入和删除的线性表。允许插入和删除的一端叫栈顶(top),而不允许插入和删除的另一端叫栈底(bottom)。
  2. 栈一般是用顺序表实现的,因为只考虑在栈顶进行插入和删除,获取也是获取的栈顶元素,不需要考虑其他位置。

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. 入栈

  1. 入栈只能在栈顶入栈,这里实现用的是数组,所以是在数组末尾入栈的。

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. 出栈也是从栈顶出元素,删除栈顶的元素,既为出栈,在这里依然是删除数组末尾的元素即可,所以实现起来比较简单,直接检查栈是否为空,有效个数 -1 即可。

void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));// 检查栈是否为空
	--ps->top;// 有效个数 -1
}

4. 获取栈顶元素

  1. 获取栈顶元素,检查栈是否为空,然后返回栈顶元素(末尾元素)即可。

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}

5. 检查站中有效个数

  1. 返回top即可。
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->top;
}

6. 检查栈是否为空

  1. 检测栈是否为空,如果为空返回非零结果,如果不为空返回0。
int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

7. 销毁栈

  1. 释放 ps->a,防止内存泄漏。
void StackDestroy(Stack* ps)
{
	assert(ps);
	if (ps->a) // 检查是否为空,不为空就释放
	{
		free(ps->a); // 防止内存泄漏
	}
	ps->a = NULL; // 置空,防止变成野指针
	ps->top = 0; 
	ps->capacity = 0;
}

面试题

学了栈,可以做一道括号匹配题来检验你是否学会了,链接:有效的括号.

扩展

学到这,想必大家都知道栈是比较简单的线性表,但它是一种最常用和最重要的数据结构,用途是非常广泛的。

例如:

  1. 汇编处理程序中的句法识别和表达式计算就是基于栈实现的。
  2. 栈还经常使用在函数调用时的参数传递和函数值的返回方面。

下来之后,大家可以自己去了解了解栈的作用哦,这里就不多说了。
源码链接:gitee.

ps:制作不易,记得三连!!!

以上是关于Day4:数据结构之栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之栈和队列

数据结构之栈

数据结构之栈

数据结构之栈

数据结构之栈

python数据结构之栈