数据结构之栈的顺序存储结构实现_实现一个顺序存储的栈_Roger-Pang的博客-程序员资料

技术标签:   数据结构与算法  顺序存储  伪代码  

  • 栈的顺序存储结构实现
    栈的数据元素之间的一一对应的关系可以利用顺序的存储来表示, 那么可以利用数组来实现栈数据结构.

  • 存储结构伪代码

struct stack_record;
typedef struct stack_record * stack;

stack init_stack(int max_elements); // 初始化操作, 建立空栈
void dispose_stack(stack s); // 销毁栈
void clear_stack(stack s); // 清空栈
int is_empty(stack s); // 判断栈是否为空
int is_full(stack s); // 判断栈是否已满
element_type get_top(stack s); // 获取栈顶元素
void push(element_type element, stack s); // 入栈
void pop(stack s); // 出栈

struct stack_record {
    int capacity; // 栈的最大容量
    int top_of_stack; // 栈顶的下标
    element_type *array; // 存储元素的数组
};
  • 实现 init_stack 函数
    思路:
    step1: 创建栈记录s
    step2: 为栈记录中存储数据的数组分配内存
    step3: 设置栈的最大容量
    step4: 初始化栈顶位置
stack init_stack(int max_elements)
{
    stack s = malloc(sizeof(struct stack_record));
    if(s == NULL)
        error("Out of space.");

    s->array = malloc(sizeof(element_type) * max_elements);
    if(s->array == NULL)
        error("Out of space.");
    s->capacity = max_elements;
    s->top_of_stack = start;

    return s;
}
  • 实现 dispose_stack 函数
    思路: 先释放栈记录中存储数据的数组的内存, 再释放栈记录的内存
void dispose_stack(stack s)
{
    if(s != NULL) {
        free(s->array);
        free(s);
    }
}
  • 实现 clear_stack 函数
    思路: 将栈记录中栈顶位置设置为起始位置
void clear_stack(stack s)
{
    s->top_of_stack = start; // start等于-1
}
  • 实现 is_empty 函数
    思路: 比较栈顶是否在起始位置
bool is_empty(stack s)
{
    return s->top_of_stack == start; // start等于-1
}
  • 实现 is_full 函数
    思路: 比较栈顶是否达到栈的最大容量位置
bool is_full(stack s)
{
    return s->top_of_stack == s->capacity;
}
  • 实现 get_top 函数
    思路: 先从栈记录中获取栈顶下标, 在用下标从数组中获取数组元素
element_type get_top(stack s)
{
    if(!is_empty(s)) {
        return s->array[s->top_of_stack];
    }
    else {
        error("Empty satck!");
        return 0;
    }
}
  • 实现 push 函数
    思路: 将element的值赋给数组的top_of_stack +1的位置, 并将top_of_stack的值加1
void push(element_type element, stack s)
{
    if(is_full(s)) {
        error("Full stack!\n"};
    }
    else {
        s->array[++(s->top_of_stack)] = element;
    }
}
  • 实现 pop 函数
    思路: 将top_of_stack的值减1
void pop(stack s)
{
    if(id_empty(s)) {
        error("Empty stack!\n");
    }
    else {
        s->top_of_stack--;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31504597/article/details/80410898

智能推荐

计算机图形学c#版pdf,计算机图形学的数学工具与C#实现.pdf_weixin_39771969的博客-程序员资料

计算机图形学的数学工具与C#实现.pdf国外科技新书评介 2010年第2期 (总第274期) 计算机科学YoshifumiM asunagaAoyamaGakuin 务的系统结构中是必不可少的,为了进行University,Japanetaleds. 性能分析,要求用工作流方式来表示,该Advancesin Scalabl...

全面学习和应用ORACLE ASM特性_cuidun9470的博客-程序员资料

ORACLE10g版本推出时,为了简化RAC中存储端的配置,ORACLE新推出了ASM(Automatic Storage Management --自动存储管理)特性,该特性拥有易管理,高自动性,并且,拥有号称超越裸设备IO性...

SpringBoot--YAML配置_如果是yml文件,必须引snakeyaml 依赖解析吗_吴声子夜歌的博客-程序员资料

YAMLYAML是JSON的超集,简介而强大,是一种专门用来书写配置文件的语言,可以替代application.properties。在创建一个Spring Boot项目时,引入的spring-boot-starter-web依赖间接地引入了snakeyaml依赖,snakeyaml会实现对YAML配置的解析。YAML的使用非常简单,利用缩进来表示层级关系,并且大小写敏感。在Spring Bo...

SSD框架详细解读(一)_ssd先验框_rainforestgreen的博客-程序员资料

目录模型结构Prior box默认框的产生Prior box 的大小尺寸计算输出层通道num_output计算。Priorbox的使用Permute,Flatten And Concat Layersmatching strategy:选择一系列default boxeshard negative miningdata augmentation技巧对比效果结...

推荐:细数Java开发者的艰辛历程_普通网友的博客-程序员资料

前言受到疫情影响我从过完年一直呆在家里,索性学点知识方便以后跳槽涨薪,于是从二月份开始学习阿里P8架构师纯手打的一份Java面经手册,没想到5月初我成功从我们三线的一个小公司跳槽进了腾讯,虽然等级不高,但是涨薪还是涨了8K,而且去一个大公司多学点东西,对自己的成长还是有好处的。虽然说是面经手册,但是里面的涵盖的知识点还是很全面、很细的,一共分了一下十几个大部分:java基础、集合类Set、锁volatile synchronized Lock ReentrantLock AQS C、java多线程:、J

随便推点

c语言如何为结构数组赋值,C语言结构体数组同时赋值的另类用法_爱雪君的博客-程序员资料

说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子:#include struct student{int a;int b ;int c ;};struct student array1[1000] ;int main(void){int i ;for(i = 0 ; i < 1000 ; i++){array[i].a = 1 ;array[i].b = ...

子网掩码,网络号,主机号 计算问题。_可用网络号为什么要减去最小和最大_qq_21439291的博客-程序员资料

IPV4地址划分有三种:⑴ 由网络位+主机位组成。分为:A、B、C、D、E类,其中A、B、C是常用的,这个在很多书上都可以看到。①A类地址:网络号占8位(第一位为0),主机号占24位。网络号的范围:1~126(0000 0001~0111 1111)(注:为什么不到127? 因为127为网络保留,有其他作用;为什么没有0?网络号全为0为保留地址)最大可用网络数:126=2^

本地数据库与API调取的数据的同步_调第三方api本地要不要存数据,如何存_Dream丶mechinics的博客-程序员资料

最近做项目需要将通过API的到的数据存到本地,并且确保本地数据库中某张表的数据与数据源的数据保持一定的同步性,以下为解决问题的思路:1.在本地做好映射确保可以从外部访问,让api的提供方在数据库提供一个触发器,当数据提供方的数据发生变化时,主动同步到本地。(对方拒绝,扑街)2.用Mysql的repalce into 语句进行结合定时器来对数据的定时更新。3.网上还有一种思路是,从本地数据库调用此表中不变的字段...

查看树莓派IP地址以及VNC远程连接_查看vnc client端 ip_weixin_45464393的博客-程序员资料

1.先在终端输入sudo raspi-config2.找到Interfacing 进入3.开启vnc 重启树莓派4.打开windows下的 vnc viewer5.右上角点击File 创建新连接6.输入账号密码进行连接

BAT解密:互联网技术发展之路(8)- 用户层技术剖析_华仔爱技术的博客-程序员资料

互联网业务用户层技术主要包括:用户管理、消息推送、存储云、图片云。用户管理互联网业务的一个典型特征就是通过互联网将众多分散的用户连接起来,因此用户管理是互联网业务必不可少的一部分。稍微大一点的互联网业务,肯定会涉及到多个子系统,这些子系统不可能每个都自己来管理这么庞大的用户,由此引申出用户管理的第一个目标:SSO,单点登录,又叫统一登录。单点登录的技术实现手段较多,例如cookie、token等,

HAL库之读写STM32F103内部的FLASH空间_stm32f103 hal flash_天天搬砖,至死不渝的博客-程序员资料

在此声明——本文摘自这里:【码神岛】STM32F0x HAL库学习笔记(5)片内FLASH的读写操作本文开发环境MCU型号:STM32F103C8T6IDE环境: MDK 5.25代码生成工具:STM32CubeMx 5.0.1HAL库版本:v1.9.0本文内容MCU片内Flash(闪存)的擦除与读写一个Flash读写例子/*main.c中的代码*/void FLASH_EEPROM_Write(uint32_t n);uint32_t FLASH_EEPROM_Read(

推荐文章

热门文章

相关标签