一篇文章讲透顺序栈!!!

目录

1.栈的定义

2.栈的分类

3.栈的功能

4.栈的声明

5.栈的功能的具体实现

5.1栈的初始化

5.2判断栈是否为空

5.3返回栈顶元素

5.4返回栈的数据个数

5.5入栈

5.6出栈

5.7打印栈元素

5.8销毁栈

6.头文件


1.栈的定义

栈是一种只允许在一端进行操作(插入和删除)的线性表。

栈是严格遵守后进先出的一种数据结构,简称LIFO结构。

2.栈的分类

由于栈是一个只允许在一端进行操作的线性表,因此我们可以使用单链表或者线性表(数组)来实现一个栈。

3.栈的功能

栈的功能,无非是对数据进行增删查改的操作。

我们在此篇文章中实现以下几个功能。

1.栈的初始化

2.判断栈是否为空

3.返回栈顶元素

4.返回栈的数据个数

5.入栈

6.出栈

7.打印栈元素

8.销毁栈

4.栈的声明

顺序栈即用数组完成一个栈

因此我们需要在声明一个数组。

而数组不是无限长的,因此我们需要声明一个变量表示数组的容量

由于我们只能从栈顶出数据,因此我们需要声明一个变量表示栈顶的位置

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		//栈顶
	int capacity;	//容量
}Stack;

5.栈的功能的具体实现

5.1栈的初始化

首先我们应该断言一下看看传来的指针是不是有效的。

然后我们就可以初始化我们的栈了

首先,我们应该给数组开一个空间,这里我们动态申请四个空间。

然后我们就需要更新栈顶和容量。

这里的容量可以定义为0也可以定义为我们申请的空间值,这里是无所谓的。 

void StackInit(Stack* st)
{
	assert(st);
	st->a = (STDataType*)malloc(4 * sizeof(STDataType));
	if (!(st->a))
	{
		perror("malloc fail!");
		exit(1);
	}
	st->capacity = 0;
	st->top = 0;
}

5.2判断栈是否为空

判断一个栈是否为空,就是判断栈顶元素的位置。

如果栈顶元素top的位置还是0,那么这个栈就是空的。 

bool StackEmpty(Stack* st)
{
	assert(st);
	return (st->top == 0);
}

5.3返回栈顶元素

返回栈顶元素就是返回top位置元素的值,因此我们返回数组中对应的值即可。

但是这里要注意,我们返回数组是返回数组的下标,由此我们应该如此写代码:

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

5.4返回栈的数据个数

返回栈的数据个数,就是看看栈里面已有了多少个数据。

而我们的top恰好就是数据的个数,因此我们返回top即可。

int StackSize(Stack* st)
{
	return st->top;
}

5.5入栈

由于我们每次入栈都需要判断一下空间够不够,因此我们在初始化的时候,capacity初始化为0或初始化为4是无所谓的。

入栈前首先要判断一下空间还够不够用,这个我们可以单独当作一个函数写出来也可以写到入栈函数中。

入栈时,我们需要进行的操作是让栈顶元素+1,并将下标为top位置处的数组元素置为指定值。

//判断空间
void STCheckCapacity(Stack* st)
{
	//已满
	if (st->top == st->capacity)
	{
		int newcapacity = st->capacity == 0 ? 4 : 2 * (st->capacity);
		STDataType* tmp = (STDataType*)realloc(st->a, newcapacity * sizeof(newcapacity));
		if (!tmp)
		{
			perror("realloc fail!");
			exit(1);
		}
		st->a = tmp;
		st->capacity = newcapacity;
	}
}
//入栈
void StackPush(Stack* st, STDataType x)
{
	assert(st);
	STCheckCapacity(st);
	st->a[st->top] = x;
	st->top++;
}

5.6出栈

出栈就是将栈顶元素(弹出)删掉,根据我们之前在单链表学习的知识,这里直接让top--即可。 

void StackPop(Stack* st)
{
	assert(st);
	assert(!StackEmpty);
	st->top--;
}

5.7打印栈元素

void StackPrint(Stack* st)
{
	assert(st);
	for (int i = 0; i < st->top; i++)
	{
		printf("%d\n", st->a[i]);
	}
}

5.8销毁栈

动态申请的空间释放掉之后需要记得置空,不然就要寄掉了 

void StackDestroy(Stack* st)
{
	assert(st);
	free(st->a);
	st->a = NULL;
	st->capacity = 0;
}

6.头文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		//栈顶指针
	int capacity;	//容量
}Stack;
void STCheckCapacity(Stack* st);//判断空间
void StackInit(Stack* st);//初始化栈
bool StackEmpty(Stack* st);//判断栈是否为空
STDataType StackTop(Stack* st);//返回栈顶元素
int StackSize(Stack* st);//栈的大小
void StackPush(Stack* st, STDataType x);//入栈
void StackPop(Stack* st);//出栈
void StackPrint(Stack* st);//打印
void StackDestroy(Stack* st);//销毁栈

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值