数据结构:顺序栈和链式栈的实现

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回) 前言本次分享2018年发表在ICDM上的论文----「Self-Attentive Sequential Recommendation」。主要是应用self-attention机制来做一... 阅读详情

一.顺序栈

1.1 概念

栈是一种 先进后出 的数据结构 FILO(first in last out)

1.2栈的逻辑结构

线性结构

1.3顺序栈的存储结构

顺序存储的栈,我们称之为顺序栈,

是基于数组实现的,一般会配合一个 "栈顶指针" top 来使用

顺序栈本身相当于对顺序表操作的一个约束:只允许在同一端插入和删除元素。

顺序栈的操作:

创建栈

清空栈

销毁栈

向栈中插入元素:入栈/压栈(push)

判断栈是否为满

获取栈中的元素:出栈/弹栈(pop)

判断栈是否为空

1.4顺序栈代码实现:

1.4.1头文件:

#ifndef _SEQ_STACK_H_
#define _SEQ_STQACK_H_

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

#define N 3

typedef struct __STACK{
    int s[N];
    int top;
}stack_t;

int create_stack(stack_t **p);
int push_stack(stack_t* my_stack, int value);
int is_full(stack_t *my_stack);
int pop_stack(stack_t *my_stack, int *num);
int print_stack(stack_t *my_stack);
int is_empty(stack_t* my_stack);
int clean_stack(stack_t *my_stack);
int destroy_stack(stack_t **my_stack);
#endif

1.4.2函数文件:

#include "seq_stack.h"
//创建栈空间
int create_stack(stack_t **p)
{
    if (NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }

    *p = (stack_t*)malloc(sizeof(stack_t));
    if (NULL == *p){
        printf("内存分配失败\n");
        exit(-1);
    }

    (*p)->top = 0;

    return 0;
}
//出栈
int push_stack(stack_t* my_stack, int value)
{
    if (NULL == my_stack){
        printf("入参为NULL,请检查\n");
        return -1;
    }

    if (is_full(my_stack)){
        printf("栈已经满了\n");
        return -1;
    }

    my_stack->s[my_stack->top] = value;
    my_stack->top++;

    return 0;
}
//判断是否为满
int is_full(stack_t *my_stack)
{
    if (NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    return my_stack->top==N?1:0;
}
//判断是否为空
int is_empty(stack_t* my_stack)
{
    if (NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    return my_stack->top == 0?1:0;
}
//出栈
int pop_stack(stack_t *my_stack, int *num)
{
    if (NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    if (is_empty(my_stack)){
        printf("栈已经空了,出栈失败\n");
        return -1;
    }

    my_stack->top--;
    *num = my_stack->s[my_stack->top];

    return 0;
}
//打印
int print_stack(stack_t *my_stack)
{
    if (NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    int i = 0;

    for (int i =0; i < my_stack->top; i++){
        printf("%d ",my_stack->s[i]);
    }

    printf("\n");

    return 0;
}

int clean_stack(stack_t *my_stack)
{
    
    if (NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    my_stack->top = 0;
}

int destroy_stack(stack_t **my_stack)
{
    if (NULL == my_stack || *my_stack == NULL){
        printf("入参为NULL 请检查\n");
        return -1;
    }

    free(*my_stack);
    *my_stack = NULL;

    return 0;
}

二链式栈:

2.1概念:

链式存储的栈,我们称之为链式栈,

是基于链表实现的

链式栈本身相当于对链表表操作的一个约束:只允许在同一端插入和删除元素。

如果采用链表尾作为入栈和出栈的端点,那么入栈和出栈都需要遍历,时间复杂度都是O(n)

所以一般链式栈都是 使用链表头部进行 入栈和出栈 时间复杂度是 O(1)

2.2顺序栈的操作:

创建栈

清空栈

销毁栈

向栈中插入元素:入栈/压栈(push)

获取栈中的元素:出栈/弹栈(pop)

判断栈是否为空

打印栈中所有元素--学习阶段看现象用的

2.3代码实现:

2.3.1头文件:

#ifndef _LINK_STACK_H_
#define _LINK_STACK_H__

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

typedef struct _Node{
    int data;
    struct _Node *next;
}node_t;

typedef struct _Stack{
    unsigned int count;
    node_t* top;
}stack_t;

int create_stack(stack_t **my_stack);
int push_stack(stack_t *my_stack, int value);
int is_empty(stack_t *my_stack);
int pop_stack(stack_t *my_stack, int *num);
int print_stack(stack_t *my_stack);
int clean_stack(stack_t *my_stack);
int destroy_stack(stack_t **my_stack);
#endif

2.3.2函数文件:

#include "link_stack.h"

int create_stack(stack_t **my_stack)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    *my_stack = (stack_t*)malloc(sizeof(my_stack));

    (*my_stack)->top = NULL;
    (*my_stack)->count = 0;

    return 0;
}

int push_stack(stack_t *my_stack, int value)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    node_t* pnew = (node_t*)malloc(sizeof(node_t));
    pnew->next = NULL;
    pnew->data = value;

    pnew->next = my_stack->top;
    my_stack->top = pnew;

    my_stack->count++;

    return 0;
}

int pop_stack(stack_t *my_stack, int *num)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    if (is_empty(my_stack)){
        printf("栈为空,出栈失败\n");
    }

    *num = my_stack->top->data;

    node_t* temp;

    temp = my_stack->top;
    my_stack->top = temp->next;

    free(temp);
    temp = NULL;

    my_stack->count--;
    return 0;
}

int is_empty(stack_t *my_stack)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    return my_stack->count == 0 ? 1 : 0;
}

int clean_stack(stack_t *my_stack)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    node_t* pdel = NULL;

    while (my_stack->top != NULL){
        pdel = my_stack->top;
        my_stack->top = pdel->next;
        free(pdel);
    }

    pdel = NULL;

    my_stack->count = 0;

    return 0;
}

int destroy_stack(stack_t **my_stack)
{
    
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    clean_stack(*my_stack);

    free(*my_stack);
    *my_stack = NULL;

    return 0;
}

int print_stack(stack_t *my_stack)
{
    if (my_stack == NULL){
         printf("入参错误,请检测\n");
    }

    node_t* ptemp = my_stack->top;

    while(NULL != ptemp){
        printf("%d ", ptemp->data);
        ptemp = ptemp->next;
    }

    printf("\n");
}
差分运放电路输出电压偏置设计解析 差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。 阅读详情

相关推荐

超大规模集成电路先进光刻理论与应用.pdf

光刻技术是所有微纳器件制造的核心技术。在集成电路制造中,正是由于光刻技术的不断提高才使得摩尔定律得以继续。本书覆盖现代光刻技术的重要方面,包括设备、材料、仿真(计算光刻)工艺。在设备部分,对业界使用的主流设备进行剖析,介绍其原理结构、使用方法、工艺参数的设置。在材料部分,介绍了包括光刻胶、抗反射涂层、抗水涂层、使用旋图工艺的硬掩膜等材料的分子结构、使用方法,以及必须达到的性能参数。本书按照仿真技术发展的顺序,系统介绍基于经验的光学邻近效应修正、基于模型的光学邻近效应修正、亚曝光分辨率的辅助图形、光源-掩模版共优化技术反演光刻技术。如何控制套刻精度是光刻中公认的技术难点,本书有一章专门讨论曝光对准系统控制套刻精度的方法。另外,本书特别介绍新光刻工艺研究的方法论、光刻工程师的职责,以及如何协调各方资源保证研发进度。

数据结构-----顺序栈 链式

目录 顺序栈 顺序栈实现 链式 链式实现 ,是仅限定在表尾进行插入或删除操作的线性表。因此,对来说,表尾端有其特殊含义,称为顶(top),相应的,表头段称为底(bottom)。不含元素的空表称为空。 假设S = {a1,a2,a3,......an},则称a1为底元素,an为顶元素。中的元素按a1,a2,a3,......,...

FDk_LCL的博客 670

1_c语言实现操作_

C语言实现顺序栈,完成的存储定义、初始化、入(压)、出(弹)、判空、取顶操作

顺序栈实现(C++,代码)

【代码】顺序栈实现(C++,代码)

qq_74156152的博客 303

数据结构(2)顺序栈/的基本实现(c)(详细的很)

介绍: 是计算机编程里面一种较为简单,基础的数据结构类型,又名堆。同线性表一样,的存储方式也分为顺序存储链式存储。 (以单端为例)其大概示意图如下: 1.只能从一端进入,一端出去,也就是说是一个半封闭的数据结构。 2.遵循先进先出的原则。 3.出只能发生在顶,而不能发生在底。 4.入:外部数据从顶进入里 5.出顶数据从顶方向弹出 一. 顺序栈 1....

YSJ367635984的博客 2070

数据结构 顺序栈链式实现

一、顺序栈实现顺序栈利用到顺序表的一些知识,当然你可以联想到数组,把其中一端固定为base,这里我们采用严蔚敏《数据结构》中的规范--空递增的方式。满后可以利用realloc拓展。具体实现代码如下:#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; //******宏定义参数****** #define OK 1 #define NO 0 #de...

小胡同的诗 1100

数据结构顺序栈链式的原理,实现实际应用

本篇博客介绍了用C语言这一经典数据结构的运用,我们来一起了解顺序栈链式的优缺点,及其相关实现操作。帮助读者深入了解的概念实现原理,最后总结的特点,优势,及广泛用途的重要性。

Zhihuiguoz的博客 985

数据结构的概念并且用Java实现(两种方法,顺序栈链式

的概念 是一种只允许在一端进行插入或删除的线性表。 1、的操作端通常被称为顶,另一端被称为底。 2、的插入操作称为进(压|push);删除操作称为出(弹|pop)。 特点 就像一个杯子,我们只能从杯口放取,所以中的元素是“先进后出”的特点。 存储结构 顺序存储的称为顺序栈链式存储的称为链式。 java实现 我们可以围绕的4个元素来实现: 2状态:是否空;是否满。 2操作:压push;进pop。 顺序栈实现   顺序栈示意图: .

qq_51066068的博客 954

数据结构Java实现03----顺序栈链式

一、堆的基本概念: 堆(也简称作)是一种特殊的线性表,堆的数据元素以及数据元素间的逻辑关系线性表完全相同,其差别是线性表允许在任意位置进行插入删除操作,而堆只允许在固定一端进行插入删除操作。 先进后出:堆中允许进行插入删除操作的一端称为顶,另一端称为底。堆的插入删除操作通常称为进或入,堆的删除操作通常称为出或退。 备注:本身就是一个线性表,所...

aie92502的博客 340

Java中堆链式数组_数据结构Java实现05----顺序栈链式

一、堆的基本概念:堆(也简称作)是一种特殊的线性表,堆的数据元素以及数据元素间的逻辑关系线性表完全相同,其差别是线性表允许在任意位置进行插入删除操作,而堆只允许在固定一端进行插入删除操作。先进后出:堆中允许进行插入删除操作的一端称为顶,另一端称为底。堆的插入删除操作通常称为进或入,堆的删除操作通常称为出或退。备注:本身就是一个线性表,所以我们之前讨论过线性表...

weixin_32316643的博客 316

数据结构Java实现05----顺序栈链式

一、堆的基本概念: 堆(也简称作)是一种特殊的线性表,堆的数据元素以及数据元素间的逻辑关系线性表完全相同,其差别是线性表允许在任意位置进行插入删除操作,而堆只允许在固定一端进行插入删除操作。 先进后出:堆中允许进行插入删除操作的一端称为顶,另一端称为底。堆的插入删除操作通常称为进或入,堆的删除操作通常称为出或退。 备注:本身就是一个线性表,

蜡笔小新的博客 406

Java中堆链式数组_数据结构Java实现03----顺序栈链式

一、堆的基本概念:堆(也简称作)是一种特殊的线性表,堆的数据元素以及数据元素间的逻辑关系线性表完全相同,其差别是线性表允许在任意位置进行插入删除操作,而堆只允许在固定一端进行插入删除操作。先进后出:堆中允许进行插入删除操作的一端称为顶,另一端称为底。堆的插入删除操作通常称为进或入,堆的删除操作通常称为出或退。备注:本身就是一个线性表,所以我们之前讨论过线性表...

weixin_42349469的博客 337

Python实现的基本操作——顺序栈&链式

什么是是限制在一端进行插入操作删除操作的线性表(俗称堆),允许进行操作的一端称为"顶",另一固定端称为"底",当中没有元素时称为"空" 如图所示我们可以清晰的看到,我们只对顶进行操作,属于先进后出的原则。 顺序栈代码实现 """ python实现模型 - 顺序存储 设计思路: 1. : LIFO 后进先出 2. 设计 顶:列表尾部(入底: 不进行任何操作 """ import time class Stack:

weixin_46120601的博客 2744
上一篇: 数据结构:约瑟夫环
下一篇: 数据结构:顺序队列,链式对列,循环队列的详细说明
向着太阳迎着光_
博客等级 码龄4年 614粉丝 · 62原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值