【数据结构】栈

栈是一种后进先出(LIFO)的数据结构,常用于浏览器历史记录、递归函数等场景。本文介绍了栈的基本概念,以及如何使用C语言实现一个简单的栈,包括初始化、压栈、出栈等操作。

在这里插入图片描述


前言

今天我想和大家聊聊一个程序员最亲密的伙伴之一,那就是——栈!

可能有些小伙伴已经熟悉了栈这个数据结构,但是如果你还不了解栈,没关系,我会用通俗易懂的语言为大家介绍它的定义、应用以及实现方法。希望大家会喜欢这篇文章。


一、栈的介绍

栈,它的定义非常简单:栈是一种储存数据的容器,只能访问最后一个添加进去的元素,也就是“后进先出”(Last In First Out,LIFO)。

可能有人会问,这样一个简单的数据结构有什么用呢?其实,栈在计算机科学中有着广泛的应用。比如,当你使用浏览器浏览网页时,每打开一个新页面,都会将这个页面的 URL 压入栈中。当你点击“返回”按钮时,浏览器会从栈中弹出最新的 URL,然后显示上一个页面。这就是一个栈的应用。
在程序中,栈也非常常见。比如,在递归函数中,每次函数调用都会将参数和返回地址压入栈中。当函数执行完毕后,它会从栈中弹出返回地址,然后返回到上一层调用的函数。
当然,我们也可以用栈来实现其他数据结构,比如队列。只需要使用两个栈,一个用于入队,一个用于出队,就可以实现先进先出的队列。
在这里插入图片描述

二、栈的实现

栈的实现还是很简单的
在这里插入图片描述

Stack.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int STDateType;
#define INIT 10

typedef struct Stack
{
	STDateType* a;
	int top;
	int capacity;
}ST;

//初始化
void StackInit(ST* ps);
//销毁
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDateType x);
//出栈
void StackPop(ST* ps);
//查看栈顶元素
STDateType StackTop(ST* ps);
//查看栈的大小
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"


void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void StackPush(ST* ps, STDateType x)
{
	assert(ps);
	//扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 10 : ps->capacity * 2;
		STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType)*newcapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top++] = x;
}

void StackPop(ST* ps)
{
	assert(ps);
	if (ps->top == 0)
	{
		printf("栈为空, 无需删除\n");
		exit(-1);
	}
	ps->top--;
}

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
}

STDateType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

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

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

Text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"

void test()
{
	ST s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	StackPush(&s, 5);
	printf("%d ", StackTop(&s));
	StackPop(&s);
	printf("%d ", StackTop(&s));
	StackPop(&s);

	while (!StackEmpty(&s))
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}
	
	//StackPop(&s);
	//StackPop(&s);
	//StackPop(&s);

	StackDestroy(&s);

}

int main(void)
{
	test();
	return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值