stack顺序存储结构

Easter79
• 阅读 484

《偶刚开始学习数据结构,欢迎拍砖111》

栈是只能通过访问它的一段来实现数据存储的一种线性数据结构,换句话来说就是先进后出的原则,FILO,与队列刚好相反哈,现在只说stack。

栈包括以下几种基本运算

(1)初始化

(2)判断是否为空

(3)push

(4)pop

(5)top

其他的则根据这几种基本操作进行组合,即可实现。

栈的实现同样有顺序存储与链式存储两种方式,现在说一说顺序存储

首先顺序存储简单可以理解为对数组的操作,所以他的缺点就是容量是有限的。

ok,言归正传。

《一》array_based_stack的实现

首先同样将存储的元素设定为int

下面是stack类型

#define MAX_STACK_SIZE 100     //栈的容量
typedef struct ArrayBasedStack{
    int *base; //存储空间
    int top;   //top指向最上面的一个可用元素,为空时,top = -1;

}AStack;

以及以下几个操作的定义

int initStack(AStack* s);
bool stackEmpty(AStack* s);
int* push(AStack* s, int elem);//成功则返回栈顶指针,否则返回null
int* pop(AStack* s);//返回新的栈顶指针
int top(AStack* s);

下面是实现

#include "stack_array_based.h"
#include <MALLOC.H>
#include <STDIO.H>
int initStack(AStack* s)
{
    s->base = (int *)malloc(MAX_STACK_SIZE * sizeof(int));
    if (s->base==NULL)
    {
        return -1;
    }
    s->top = -1;
    return 0;
}

bool stackEmpty(AStack* s)
{
    if (s->top == -1)
    {
        return true;
    }
    return false;
}
int* push(AStack* s, int elem)
{
    if (s->top==MAX_STACK_SIZE-1) //栈满
    {
        return NULL;
    }
    s->top++;
    s->base[s->top] = elem;
    
    return &(s->base[s->top]);
}
int* pop(AStack* s)//返回新的栈顶指针
{

    if (stackEmpty(s))
    {
        return NULL;
    }
    s->top --;
    if (top<0)
    {
        return NULL;
    }
    return &(s->base[s->top]);
}
int top(AStack* s)
{
    return (s->base[s->top]);
}

最后再来个简单的测试实例

#include "stack_array_based.h"
#include <MALLOC.H>
#include <STDIO.H>

int main()
{
    AStack* s = (AStack*)malloc(sizeof(AStack));
    if (s == NULL)
    {
        return -1;
    }
    
    initStack(s);
    printf("top:%d\n",s->top);
    //向栈中插入是个数据
    for (int i = 0; i<10; i++)
    {
        push(s,i);
    }
    //将数据打印
    while(!stackEmpty(s))
    {
        printf("%d\t",top(s));
        pop(s);
    }
}

实验结果如下 stack顺序存储结构

《二》栈的链式实现

请参照linklist,自行实现。

《偶刚开始学习数据结构,欢迎拍砖111》

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
九路 九路
3年前
5 手写Java Stack 核心源码
Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。只能在一端进行插入或者删除,即压栈与出栈栈的实现比较简单,性质也简单。可以用一个数组来实现栈结构。1.入栈的时候,只在数组尾部插入2.出栈的时候,只在数组尾部删除我们来看一下Stack的用法:如下publicstaticvoidmai
Souleigh ✨ Souleigh ✨
2年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Wesley13 Wesley13
2年前
Java实现顺序栈
一、分析  栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。  顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。  一个标准的顺序栈
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
Java学习系列——第3课Java 高级教程
java数据结构  1)【概述】  Java的工具包提供了强大的数据结构在的Java中的数据结构主要包括以下几种接口和类:枚举(枚举)位集合(位集合)向量(矢量)栈(栈)字典(词典)哈希表(哈希表)属性(属性)
菜园前端 菜园前端
11个月前
什么是栈?
原文链接:栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。实现功能在JavaScript中没有栈,但是可以通过Array实现栈的所有功能push()入栈po
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k