【数据结构入门 】栈

avatar
作者
猴君
阅读量:0

目录

前言

一、栈的概念及结构

二、栈的实现

1. 栈的声明

2.初始化栈 

3. 栈的销毁

4.判断是否为空栈

 5.入栈(只能插入栈顶元素)

6. 出栈(只能从栈顶删除)

 7.栈的大小

8.获取栈顶元素

总结


前言

        在计算机科学中,栈(Stack)是一种常见的数据结构,它遵循“后进先出”(LIFO)原则。栈可以被看作是一种特殊的线性表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶。
栈的操作相对简单,只有两种基本操作:入栈(Push)和出栈(Pop)。入栈将一个元素放入栈顶,出栈将栈顶元素弹出,也就是从栈中删除一个元素。
        栈的应用非常广泛,特别是在计算机编程中。它常常作为一种临时存储空间来管理函数调用、表达式求值等操作。栈也常被用来处理递归算法、深度优先搜索、括号匹配等问题。
        通过构建一个栈,我们可以非常方便地实现后进先出的数据结构,使得我们能够高效地处理一些具有类似特性的问题。因此,了解和掌握栈的概念和操作是很重要的。在接下来的内容中,我们将详细介绍栈的基本原理、以及常见实现方式。希望通过本文的学习,读者能够深入理解栈,并能够在实际编程中熟练运用。

一、栈的概念及结构

        栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

        压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

        出栈:栈的删除操作叫做出栈。出数据也在栈顶

二、栈的实现

        栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

1. 栈的声明

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

记录栈顶和容量 

2.初始化栈 

void STInit(ST* ps) { 	assert(ps);  	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4); 	if (ps->a == NULL) 	{ 		perror("malloc fail"); 		return; 	}  	ps->capacity = 4; 	ps->top = -1;//栈顶元素位置 }

top记录栈顶元素位置,或者下一位都可以,但是要注意之后的使用。

3. 栈的销毁

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

4.判断是否为空栈

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

 5.入栈(只能插入栈顶元素)

void STPush(ST* ps, STDataType x) { 	assert(ps);  	if ((ps->top +1) == ps->capacity) 	{ 		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity*2); 		if (tmp == NULL) 		{ 			perror("malloc fail"); 			return; 		}  		ps->a = tmp; 		ps->capacity *= 2; 	}  	ps->a[ps->top + 1] = x;  	ps->top++; } 

这里在判断容量够不够时只在入栈时使用,所以可以不用封装函数;

在容量不够时需要扩容。

6. 出栈(只能从栈顶删除)

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

 7.栈的大小

int STSize(ST* ps) { 	assert(ps);  	return ps->top + 1; }

8.获取栈顶元素

STDataType STTop(ST* ps) { 	assert(ps); 	assert(!STEmpty(ps));  	return ps->a[ps->top]; }

总结

        在了解了栈如何实现后,还需要多做相关题目才可以理解栈的用法,可以在网上多找一些题目练练手哟!

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!