首页 > 编程语言 >数据结构与算法——顺序栈的实现

数据结构与算法——顺序栈的实现

时间:2024-10-26 15:52:21浏览次数:11  
标签:arr 顺序 return struct int top 算法 数据结构 stack

数据结构栈——一列数据,表尾入栈,表尾出栈,类似于子弹弹匣,压入子弹和拿出子弹都是从最上方进出。

结构体

struct Stack{
	int *arr;
	int capacity;     //数组容量
	int top;          //存储栈顶元素的下标 
};

初始化栈

int InitStack(struct Stack *stack){
	stack->arr=malloc(sizeof(struct Stack)*8);           //给数组分配空间
	if(stack->arr==NULL) return 0;                       //判断是否分配成功
	stack->capacity=8;                                   //将数组容量改为分配好的空间大小
	stack->top=-1;                                       
	return 1;
}

初始化栈做的事情和顺序表一样,分配数组空间,并且将结构体中其它的元素设置为合适的值,方便后续对栈进行操作。注意,此时栈中元素数量为0,而栈的第一个元素的数组下标是0,所以现在栈空时的stack->top=-1

入栈操作

int PushStack(struct Stack *stack,int element){
	stack->top++;
	if((stack->top+1)==stack->capacity){
		int newcapacity=stack->capacity*2;
		int *newarr=realloc(stack->arr,newcapacity*sizeof(struct Stack));
		if (newarr==NULL) return -1;
		stack->arr=newarr;
		stack->capacity=newcapacity;	
	}
	stack->arr[stack->top]=element;
	return 1;
}

stack->top加1,并将新入栈的元素存于下标为stack->top的位置。注意和顺序表一样的是,入栈时需要判断是否栈满,如果栈满则需要扩容,扩容操作和顺序表相同。

判断栈是否为空

int IsEmpty(struct Stack *stack){
	if(stack->top==-1){
		return 0;
	}else{
		return 1;
	}
}

如果栈空,stack->top的值为-1,用这个来判断栈是否为空。如果为空,返回1,如果不为空,则返回0。

出栈操作

int PopStack(struct Stack *stack){
	int temp;
	if(IsEmpty(stack)){
		temp=stack->arr[stack->top];
		stack->top--;
		return temp;
	}
	return 0;
}

出栈操作首先需要判断栈是否为空,如果为空则没有元素可以出栈,返回错误信息0。如果不为空,则将栈顶元素的值给一个临时变量,将stack->top的值减1,最后返回临时变量得到出栈元素。

打印输出

void PrintStack(struct Stack *stack){
	int i=0;
	for(i=0;i<=stack->top;i++){
		printf("%d ",stack->arr[i]);
	}
	printf("\n");
}

通过循环遍历栈,将每一个元素打印输出。和顺序表相比,栈的打印输出需要注意,出栈操作是从数组尾部取出元素,而打印输出是通过从头开始循环遍历打印。如果我们需要多次循环出栈操作,打印出栈元素的顺序是和这里的打印输出的顺序不同的。

完整代码

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

struct Stack{
	int *arr;
	int capacity;
	int top;          //存储栈顶元素的下标 
};

int InitStack(struct Stack *stack){
	stack->arr=malloc(sizeof(int)*8);
	if(stack->arr==NULL) return 0;
	stack->capacity=8;
	stack->top=-1;
	return 1;
}

int PushStack(struct Stack *stack,int element){
	stack->top++;
	if((stack->top+1)==stack->capacity){
		int newcapacity=stack->capacity*2;
		int *newarr=realloc(stack->arr,newcapacity*sizeof(int));
		if (newarr==NULL) return -1;
		stack->arr=newarr;
		stack->capacity=newcapacity;	
	}
	stack->arr[stack->top]=element;
	return 1;
}

int IsEmpty(struct Stack *stack){
	if(stack->top==-1){
		return 0;
	}else{
		return 1;
	}
}

int PopStack(struct Stack *stack){
	int temp;
	if(IsEmpty(stack)){
		temp=stack->arr[stack->top];
		stack->top--;
		return temp;
	}
	return 0;
}

void PrintStack(struct Stack *stack){
	int i=0;
	for(i=0;i<=stack->top;i++){
		printf("%d ",stack->arr[i]);
	}
	printf("\n");
}

int main(){
	...
	return 0;
}

标签:arr,顺序,return,struct,int,top,算法,数据结构,stack
From: https://blog.csdn.net/messcodeab/article/details/143250698

相关文章

  • 初识算法 · 二分查找(4)
    目录前言:寻找峰值题目解析算法原理算法编写寻找旋转排序数组中的最小值题目解析算法原理算法编写寻找缺失的数字题目解析算法原理算法编写前言:​本文的主题是二分查找,通过三道题目讲解,一道是寻找峰值,一道是搜索旋转排序数组的最小值,一道是0-n-1中缺失的数字......
  • 如何将遗传算法与强化学习结合
    首先,说一下,在机器学习领域(人工智能领域),神经网络和遗传算法一直是互相替代的关系,虽然也有过短暂的蜜月期(使用进化算法优化或初始化神经网络参数),但是总体说来,一般神经网络发展受限的情况下遗传算法方向的研究就会受重视,而神经网络发展好的时候(如最近10年-20年),那么遗传算法这样的进化......
  • 100种算法【Python版】第10篇——深度优先搜索
    本文目录1深度优先搜索2示例说明:迷宫路径查找2.1问题描述2.2DFS解决逻辑2.3python代码3算法应用3.1数独问题3.1.1DFS求解逻辑3.1.2python代码3.2单词搜索3.2.1python代码3.2.2代码逻辑4总结4.1优点4.2缺点1深度......
  • 初阶数据结构之顺序表的实现
    1线性表什么是线性表呢?线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表,链表,栈,队列,字符串。线性表在逻辑上是线性结构,在物理结构上不一定是线性的。线性表在物理存储时,通常是以数组或链式结构形式存储。线性表大致分为两种:顺序表和链表。基于这两种......
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21
    计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录文章目录计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1.TheFairLanguageModelParadox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅......
  • 数据结构:学生成绩管理系统(链表方法)〈可直接使用〉
    本代码比较完善,有登录模块和菜单模块,拥有很高的可操控性和可观性。代码所包含的功能有很多:成绩输入与删除,按位置查询学生,按姓名查找学生,求表的长度,求最高分学生信息,显示全部学生信息,保存与读取文件......本代码的文件读取和文件保存是一大亮点,可以灵活的存取,启动一次可以切换......
  • Redis基础知识(学习笔记1--五种基础数据结构)
    Redis,Remote Dictionary Server,远程字典服务。Redis的性能极高:其读的速度可以达到11W/s,写的速度可以到达8W/s。高性能的原因(1)操作在内存中发生;(2)C语言开发;(3)源码简单精细(集性能与优雅于一身),早期版本源码只有2W行左右,从3.0版本(开始支持cluster),代码变成了5W左右。Redis有5种......
  • 代码随想录算法训练营第七天|LeetCode 344.反转字符串、LeetCode 541.反转字符串Ⅱ、
    LeetCode 344.反转字符串题目链接:LeetCode344.反转字符串文章链接:代码随想录题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示......
  • java短链接项目-短链接跳转原理包括短链接生成算法(含代码实现)
    文章目录一、图解原理二、短链接生成算法实现1.MurmurHash算法2.为什么使用原始链接和UUID生成短链接?3.为什么不只使用原始链接?4.如果一直冲突怎么办?5.完整代码实现:HashUtil.javaShortLinkController.java三、系统扩展思考题1.如何让短链接系统支持海量请求并发?2.布......
  • 【数据结构初阶】单链表接口实现超详解
    1.顺序表问题与思考上一篇博客中我们介绍了顺序表,那么顺序表有什么缺点呢?中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数......