服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中栈的结构和函数接口的使用示例

C语言中栈的结构和函数接口的使用示例

2023-03-06 15:15[Pokemon]大猫猫 C/C++

这篇文章主要介绍了C语言中栈的结构和函数接口的使用,类似很多软件都有撤销的操作,这其实就是用栈这种方法来实现的,当然不同的软件具体实现代码会有差异,不过原理大多都是一样的

一、栈的结构

栈:一种操作受限的线性表,只允许在线性表的一端进行插入和删除操作,进行插入删除的一端称作栈顶,另一端称之为栈底

C语言中栈的结构和函数接口的使用示例

通过动态顺序表的实现,可以发现在对数组进行尾插尾删时效率很高, 因此栈可以用数组实现,将数组的尾部作为栈顶, 结构如下:

C语言中栈的结构和函数接口的使用示例

通过单链表的实现,可以发现在对链表进行头插头删时效率很高,因此也可以用链表来实现,将单链表的头结点作为栈顶,结构如下:

C语言中栈的结构和函数接口的使用示例

综合考虑:数组的实现方法更优,本篇以数组的方式介绍栈的结构和函数接口

//栈的元素类型
typedef int StackDataType;
//栈的结构
typedef struct Stack
{
	StackDataType* a;	//存放元素的数组
	int top;	//指向栈顶元素的下一个位置
	int capacity;	//容量
}Stack;

 

二、栈的函数接口

1. 初始化和销毁

初始时给栈分配一些空间,并将 top置为 0,代表指向栈顶元素的下一个位置

初始化函数如下:

void StackInit(Stack* ps)
{
	assert(ps);
	//开辟空间
	ps->a = (StackDataType*)malloc(sizeof(StackDataType) * 4);
	if (ps->a == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	ps->top = 0;
	ps->capacity = 4;
}

栈是动态开辟的,不用时需要销毁

销毁函数如下:

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

2. 入栈和出栈

入栈:在栈顶插入元素,当空间不够时需要扩容

入栈函数如下:

void StackPush(Stack* ps, StackDataType x)
{
	assert(ps);
	//空间不够时,需要扩容
	if (ps->top == ps->capacity)
	{
		StackDataType* tmp = (StackDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(StackDataType));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
	//top 指向栈顶元素的下一个位置,因此 top 先插入数据,然后再自增
	ps->a[ps->top] = x;
	ps->top++;
}

出栈:删除栈顶元素

出栈函数如下:

void StackPop(Stack* ps)
{
	assert(ps);
	//栈为空时不能删除,这里直接调用判空函数
	assert(!StackEmpty(ps));	
	ps->top--;
}

3. 访问栈顶元素以及判空和元素个数

返回栈顶元素函数如下:

StackDataType StackTop(Stack* ps)
{
	assert(ps);
	//栈为空时不能取栈顶元素,这里直接调用判空函数
	assert(!StackEmpty(ps));
	//top 指向栈顶元素的下一个,所以需要-1
	return ps->a[ps->top - 1];
}

判空函数如下:

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

元素个数函数如下:

size_t StackSize(Stack* ps)
{
	assert(ps);
	//top 即为元素个数
	return ps->top;
}

到此这篇关于C语言中栈的结构和函数接口的使用示例的文章就介绍到这了,更多相关C语言栈的结构内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_70793373/article/details/128487230

延伸 · 阅读

精彩推荐
  • C/C++OpenCV实现图像切割功能

    OpenCV实现图像切割功能

    这篇文章主要为大家详细介绍了OpenCV实现图像切割功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lindamtd4732021-07-17
  • C/C++C语言实现括号匹配的方法

    C语言实现括号匹配的方法

    这篇文章主要介绍了C语言实现括号匹配的方法,文中代码简单易懂,方便大家更好的学习,感兴趣的朋友可以参考下...

    孟应杰8502021-09-09
  • C/C++VC++开发中完美解决头文件相互包含问题的方法解析

    VC++开发中完美解决头文件相互包含问题的方法解析

    本文中,为了叙述方便,把class AClass;语句成为类AClass的声明,把class AClass开始的对AClass的类成员变量、成员函数原型等的说明称为类的定义,而把在CPP中的...

    C++教程网10612020-12-28
  • C/C++一篇文章彻底弄懂C++虚函数的实现机制

    一篇文章彻底弄懂C++虚函数的实现机制

    C++中的虚函数的作用主要是实现了多态的机制,基类定义虚函数,子类可以重写该函数,在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法...

    彼 方8082021-11-19
  • C/C++C语言的模板与泛型编程你了解吗

    C语言的模板与泛型编程你了解吗

    这篇文章主要为大家详细介绍了C语言的模板与泛型编程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够...

    日天少年wzh7152022-11-02
  • C/C++C++内存四区之代码区、全局区、栈区和堆区

    C++内存四区之代码区、全局区、栈区和堆区

    C++编译器会把代码直接分为四个小区,弄懂这四小区对我们理解内存有所帮助,所以下面这篇文章主要给大家介绍了关于C++内存四区之代码区、全局区、栈区...

    ZhiboZhao11092021-11-21
  • C/C++C语言实现食堂就餐管理系统(带链表)

    C语言实现食堂就餐管理系统(带链表)

    这篇文章主要为大家详细介绍了C语言实现食堂就餐管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    wuwuwu___11282021-08-06
  • C/C++C++简明分析inline函数的使用

    C++简明分析inline函数的使用

    inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空...

    编程小程8002023-02-16