[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈

这篇具有很好参考价值的文章主要介绍了[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈


🥰作者: FlashRider

🌏专栏: 数据结构


目录

栈的前置知识

1.什么是栈?

2.生活中哪些地方有栈的影子?

顺序表实现栈

1.为什么通常采用顺序表实现栈?

2.栈的实现


栈的前置知识

1.什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

总的来说,栈就是一个线性表,只不过只能从栈顶入栈,也只能从栈顶出栈,因此栈有一个非常重要的特性——后进先出(First In Last Out)。

2.生活中哪些地方有栈的影子?

让我们来看看下面这段代码:

void f()
{
    printf("666\n");
}
int main()
{
    printf("777\n");
    f();
    return 0;
}

程序的入口是main函数, 然后执行了printf函数,printf函数结束,然后执行f()函数,在f()函数中执行了第二个printf函数,然后第二个printf函数结束,随后f()函数结束,最后才是main函数结束。

我们可以发现,作为程序入口的main反而是最后结束的,而越后执行的函数越先结束,这就是栈的后进先出特性。所以函数就是利用栈来实现调用的。

[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈

 然后printf   f()    main再依次出栈,程序结束。


顺序表实现栈

1.为什么通常采用顺序表实现栈?

我们可以发现,对栈进行插入和删除操作时,永远是在栈顶进行操作,我们把栈顺时针旋转90°,
就变成了只在表尾插入删除的线性表,因为不会大量挪动元素,所以我们选择顺序表实现。

2.栈的实现

头文件 Stack.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int STDataType;
typedef struct Stack
{
    STDataType* a;//存放数据的空间首地址
    int capacity;//当前栈最大容量
    int top;//模拟栈顶指针
}ST;
//初始化栈
void StackInit(ST* ps);
//销毁栈 
void StackDestroy(ST* ps);
//插入
void StackPush(ST* ps, STDataType x);
//弹出 
void StackPop(ST* ps);
//获取栈顶元素
STDataType GetTop(ST* ps);
//获取栈当前元素个数
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

源文件 Stack.c 

//初始化栈
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = ps->top = 0; 
}
//销毁栈 
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}
//插入
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//判满 
	if(ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		if(tmp == NULL)
		{
			printf("malloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//插入元素 
	ps->a[ps->top++] = x;
}
//弹出 
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}
//获取栈顶元素
STDataType GetTop(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;
}

测试一下写出来的栈是否可用

源文件 test.c

int main()
{
	Stack st;
	StackInit(&st);
	StackPush(&st, 1);	
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	while(!StackEmpty(&st))
	{
		printf("%d ", GetTop(&st));
		StackPop(&st);
	}
	return 0;
}

结果:

[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈文章来源地址https://www.toymoban.com/news/detail-479835.html


到了这里,关于[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手撕数据结构】(三)顺序表和链表

    🎗️线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 🎗️线性表在逻辑上是线性结构,也就说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储

    2024年02月05日
    浏览(54)
  • 数据结构之手撕顺序表(讲解➕源代码)

            在本章之后,就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握,如果有小伙伴对上面相关的知识还不是很清晰,要先弄明白再过来接着学习哦!         那进入正题,在讲解顺序表之前,我们先来介绍线性表这个数据结构。         线

    2024年02月08日
    浏览(37)
  • 【数据结构】C语言实现顺序栈

    大家好,很高兴又和大家见面啦!!! 在上一个篇章中,我们介绍了栈的基本概念,以及栈中的重要术语。通过介绍我们知道了栈的本质也是一种线性表,只不过它是一种操作受限的线性表。因此栈的实现方式与线性表的实现实际上是大同小异的。下面我们就来介绍一下如何

    2024年01月19日
    浏览(41)
  • 【数据结构】C语言实现顺序表

    顺序表是用顺序存储方式存放的线性表(可以理解为数组的存储方式),表中的元素在内存中彼此相邻。 静态存储:在定义时就确定了顺序表的大小,并且之后顺序表的大小不会改变(即使之后空间不够用了,也无法增加) 动态存储:线性表的大小可以根据需要更改(顺序

    2024年02月08日
    浏览(42)
  • 数据结构顺序表(C语言实现)

            从本章开始就是开始数据结构的开端,本章将会写出数据结构中的顺序表的代码实现,多会以注释的方法来描述一些细节(注释是我们程序员必须常用的工具)。         话不多说安全带系好,发车啦(建议电脑观看)。 附:红色,部分为重点部分;蓝颜色为需

    2024年02月10日
    浏览(52)
  • 顺序表—C语言实现数据结构

    本期带大家一起来用C语言代码实现顺序表🌈🌈🌈 顺序表是一段物理地址连续的存储单元,依次存储数据元素的线性结构。分为静态顺序表与动态顺序表。 🍊 🍋 🍒 静态顺序表 :使用定长数组用来存储数据 优点 :操作简单,代码实现容易 缺点 :定长数组很受限制,数

    2023年04月24日
    浏览(39)
  • 【数据结构】C语言实现顺序表(超级详细)

    目录 概念及结构 接口函数实现 顺序表的初始化 容量判断  顺序表尾插  顺序表尾删 顺序表头插 顺序表头删 顺序表查找 顺序表指定位置插入 顺序表指定位置删除 打印顺序表 销毁顺序表 顺序表完整代码 顺序表作为线性表的一种,它是用一段 物理地址连续的存储单元依次

    2024年04月10日
    浏览(36)
  • 【C语言数据结构】模拟·顺序表·总项目实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 我在上一篇博客中,

    2024年02月15日
    浏览(41)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(43)
  • 【数据结构】线性表的顺序存储结构及实现——C语言版

    线性表的顺序存储结构称为 顺序表 ,其基本思想是 用一段地址连续的存储单元一次存储线性表的数据元素。 设顺序表的每个元素占用 c 个存储单元,则第 i 个元素的存储地址为: 所以, 只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间

    2024年03月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包