栈——代码分享

目录

一、栈的底层逻辑选择

二、栈的规则

三、栈的实现

3.1 创建底层结构

3.2 栈的初始化

3.3 入栈

3.4 出栈

3.5 取栈顶元素

3.6 计算栈中有几个元素

3.7 判断栈是否为空

3.8 栈的销毁

四、栈的完整代码

stack.h头文件

stack.c文件

test.c文件 

*结语:

希望这篇关于栈的博客能对大家有所帮助,欢迎大家在本篇博客下留言或私信与我交流!


一、栈的底层逻辑选择

栈底层逻辑可以用数组和链表实现

这里我们选择用数组实现栈

二、栈的规则

后进先出

三、栈的实现

创建3个文件

stack.h :放各种接口

stack.c:各种接口的具体实现过程

test.c:测试文件 


3.1~3.8的代码为每一种接口的核心代码,栈完整的代码会在文章最后给出! 

3.1 创建底层结构

在stack.h头文件中定义结构体

//结构体
typedef int stackdatatype;
typedef struct stack {
	stackdatatype* a; //指向数组的指针
	int top; //栈顶元素下标
	int size; //栈的容量
}ST;


3.2 栈的初始化

void STInit(ST* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->size = 0;
	ps->top = 0;
}


3.3 入栈

void STPush(ST* ps, stackdatatype x)
{
	assert(ps);
	//栈已满
	if (ps->top  == ps->size)
	{
		//扩容
		int newsize = ps->size == 0 ? 4 : ps->size * 2;
		stackdatatype* tmp=(stackdatatype*)realloc(ps->a,sizeof(stackdatatype)*newsize);
		if (tmp== NULL)
		{
			perror("realloc!");
			return;
		}
			ps->a = tmp;
			ps->size = newsize;
	}
		ps->a[ps->top] = x;
		ps->top++;
}


3.4 出栈

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	
	ps->top--;
}


3.5 取栈顶元素

stackdatatype STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->a[ps->top - 1];
}


3.6 计算栈中有几个元素

int STSize(ST* ps)
{
	assert(ps);

	return ps->top;
}


3.7 判断栈是否为空

bool STEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

3.8 栈的销毁

void STDestory(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->top = 0;
}


四、栈的完整代码

stack.h头文件

//头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
//结构体
typedef int stackdatatype;
typedef struct stack {
	stackdatatype* a; //指向数组的指针
	int top; //栈顶元素下标
	int size; //栈的容量
}ST;

//初始化栈
void STInit(ST* ps);
//销毁栈 
void STDestory(ST* ps);
//入栈
void STPush(ST* ps, stackdatatype x);
//出栈
void STPop(ST* ps);
//取栈顶元素
stackdatatype STTop(ST* ps);
//计算栈中元素个数
int STSize(ST* ps);
//判断栈是否为空
bool STEmpty(ST* ps);

//ST* ps是为了保持接口一致性

stack.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"
void STInit(ST* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->size = 0;
	ps->top = 0;
}

void STDestory(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->top = 0;
}

void STPush(ST* ps, stackdatatype x)
{
	assert(ps);
	//栈已满
	if (ps->top  == ps->size)
	{
		//扩容
		int newsize = ps->size == 0 ? 4 : ps->size * 2;
		stackdatatype* tmp=(stackdatatype*)realloc(ps->a,sizeof(stackdatatype)*newsize);
		if (tmp== NULL)
		{
			perror("realloc!");
			return;
		}
			ps->a = tmp;
			ps->size = newsize;
	}
		ps->a[ps->top] = x;
		ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));
	
	ps->top--;
}

stackdatatype STTop(ST* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->a[ps->top - 1];
}

bool STEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}

int STSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

test.c文件 

#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"
int main() {
	ST s;
	STInit(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);
	STPop(&s);
	for (int i = 0; i < s.top; i++)
	{
		printf("%d ", s.a[i]);
	}
	printf("%d ", STSize(&s));
	STDestory(&s);
}  

*结语:

希望这篇关于栈的博客能对大家有所帮助,欢迎大家在本篇博客下留言或私信与我交流!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值