数据结构-----栈、队列

news2025/1/10 2:33:03

一、栈

1、栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
2、栈的插入操作:叫作进栈,也称压栈、入栈示。
     栈的删除操作:叫作出栈,也有的叫作弹栈。

满栈、空栈:栈顶所在位置是否存有元素

增栈、减栈:栈的增长方向

#include<head.h>
#include"stack.h"

/*创建链表*/
Stack_t *create_stack()             
{    
    Stack_t *pstack = malloc(sizeof(Stack_t));
    if(NULL == pstack)
    {
        perror("malloc fail");
        return NULL;
    }
    pstack->ptop = NULL;
    pstack->clen = 0;
    return pstack;
}

/*插入节点*/
int push_stack(Stack_t *pstack, Datatype data)
{
    SNode_t *pnode = malloc(sizeof(SNode_t));
    if(NULL == pnode)
    {
        perror("malloc fail");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    pnode->pnext = pstack->ptop;
    pstack->ptop = pnode;

    pstack->clen++;
    
    return 0;
}

/*判空*/
int is_empty_stack(Stack_t *pstack)
{
    return NULL == pstack->ptop;
}
/*遍历*/
void printf_stack(Stack_t *pstack)
{
    SNode_t *p =pstack->ptop;
    while(p)
    {
        printf("%d",p->data);
        p=p->pnext;
    }
    printf("\n");
}
/*获得栈顶*/
int get_stack_top(Stack_t *pstack,Datatype *pdata)
{
    if(is_empty_stack(pstack))
    {
        return 0;
    }
    if(pdata != 0)
    {
        *pdata = pstack->ptop->data;
        return 1;
    }
    return 0;
}
/*删除栈顶*/
int pop_stack(Stack_t *pstack,Datatype *pdata)
{
    if(is_empty_stack(pstack))
    {
        return 0;
    }
    SNode_t *p = pstack->ptop;
    pstack->ptop = p->pnext;
    if(pdata != NULL)
    {
        *pdata = p->data;
    }
    free(p);
    pstack->clen--;
    return 0;
    
}
/*清空栈*/
void clear_stack(Stack_t *pstack)
{
    while(!is_empty_stack(pstack))
    {
        pop_stack(pstack,NULL);
    }
}
/*销毁*/
void destory_stack(Stack_t *pstack)
{
    clear_stack(pstack);
    free(pstack);
}
/***********************************stack.h*********************************************/
#ifndef _STACK_H
#define _STACK_H

typedef int Datatype;

typedef struct snode
{
    Datatype data;
    struct snode *pnext;
}SNode_t;

typedef struct stack
{
    SNode_t *ptop;
    int clen;
}Stack_t;

extern Stack_t *create_stack();
extern int push_stack(Stack_t *pstack, Datatype data);
extern int get_stack_top(Stack_t * pstack,Datatype *pdata);
extern int pop_stack(Stack_t *pstack,Datatype *pdata);
extern void clear_stack(Stack_t *pstack);
extern void destory_stack(Stack_t *pstack);
extern int  is_empty_stack(Stack_t *pstack);
extern void printf_stack(Stack_t *pstack);

#endif

/***********************************main.c**********************************************/
#include<stdio.h>
#include"stack.h"

int main(int argc, const char *argv[])
{
    Datatype data;
    Stack_t *pstack = create_stack();
    if(NULL == pstack)
    {
        return -1;
    }
    push_stack(pstack,1);
    push_stack(pstack,2);
    push_stack(pstack,3);
    push_stack(pstack,4);

    printf_stack(pstack);
    
    get_stack_top(pstack,&data);
    printf("%d\n",data);
    printf_stack(pstack);
   
    pop_stack(pstack,&data);
    printf("%d\n",data);
    printf_stack(pstack);
    
    destory_stack(pstack);
    return 0;
}

二、队列

 1、 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的-端称为队尾,允许删除的一端称为队头。 

2、队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。 将队头指针指向链队列的头结点,队尾指针指向终端节点。

Queue_t *create_queue()
{
    Queue_t *pqueue = malloc(sizeof(Queue_t));
    if(NULL == pqueue)
    {
        perror("malloc fail");
        return NULL;
    }
    pqueue->pfront = NULL;
    pqueue->prear = NULL;
    pqueue->clen = 0;
    
    pthread_mutex_init(&(pqueue->mutex),NULL);

    return pqueue;
}

int is_empty_queue(Queue_t *pqueue)
{
    return NULL == pqueue->pfront;
}

int push_queue(Queue_t *pqueue,QDataType data)
{
    QNode_t *pnode = malloc(sizeof(QNode_t));
    if(NULL == pnode)
    {
        perror("malloc fail");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;
    if(is_empty_queue(pqueue))
    {
        pqueue->pfront = pnode;
        pqueue->prear = pnode;
    }
    else
    {
        pqueue->prear->pnext = pnode;
        pqueue->prear = pnode;
    }
    pqueue->clen++;
    return 0;
}

void printf_queue(Queue_t *pqueue)
{
    QNode_t *p =pqueue->pfront;
    while(p != NULL)
    {
        printf("%3d",p->data);
        p = p->pnext;
    }
    printf("\n");
}

int pop_queue(Queue_t *pqueue,QDataType *pdata)
{
    if(is_empty_queue(pqueue))
    {
        return 0;
    }
    QNode_t *p = pqueue->pfront;
    pqueue->pfront =p->pnext;
    if(pdata != NULL)
    {
        *pdata = p->data;
    }
    free(p);
    if(NULL == pqueue->pfront)
    {
        pqueue->prear = NULL;
    }
    pqueue->clen--;
     
    return 0;
}

int get_queue_front(Queue_t *pqueue, QDataType *pdata)
{
   if(is_empty_queue(pqueue)) 
   {
       return 0;
   }
   if(pdata != 0)
   {
       *pdata = pqueue->pfront->data;
       return 1;
   }
   return 0;
}

void clear_queue(Queue_t *pqueue)
{
    while(!is_empty_queue(pqueue))
    {
        pop_queue(pqueue,NULL);
    }
}
void destory_queue(Queue_t *pqueue)
{
    clear_queue(pqueue);
    free(pqueue);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI gym: Trouble installing Atari dependency (Mac OS X)

题意&#xff1a; 使用OpenAI Gym库时&#xff0c;安装Atari环境可能会遇到一些依赖问题&#xff0c;尤其是在Mac OS X系统上 问题背景&#xff1a; Im new to OpenAI gym. Ive successfully installed OpenAI gym on my Mac OS X (High Sierra 10.13.3) laptop and made a D…

C语言程序设计(算法的概念及其表示)

一、算法的概念 一个程序应包括两个方面的内容: 对数据的描述:数据结构 对操作的描述:算法 著名计算机科学家沃思提出一个公式: 数据结构 +算法 =程序 完整的程序设计应该是: 数据结构+算法+程序设计方法+语言工具 广义地说,为解决一个问题而采取的方法和步骤…

学不会虚拟列表?10分钟带你实现高度固定的Vue虚拟列表方案及原理

前言 本文主要介绍长列表的一种优化方案&#xff1a;虚拟列表。本文主要是对传统的虚拟列表方案进行更加详尽的刨析&#xff0c;以便我们能够更加深入理解虚拟列表的原理。 虚拟列表目录 1、为什么需要使用虚拟列表2、什么是虚拟列表与懒加载的区别(重要) 3、实现思路4、通过节…

企业选ETL还是ELT架构?

作为数据处理的重要工具&#xff0c;ETL工具被广泛使用&#xff0c;同时ETL也是数据仓库中的重要环节。本文将从解释ETL工具是怎么处理数据&#xff0c;同时介绍ELT和ETL工具在企业搭建数据仓库的重要优势。 一、什么是ETL? ETL是Extract-Transform-Load的缩写&#xff0c;将…

【深度学习】多层感知机的从零开始实现与简洁实现

可以说&#xff0c;到现在我们才真正接触到深度网络。最简单的深度网络称为多层感知机。 多层感知机由多层神经元组成&#xff0c;每一层与它的上一层相连&#xff0c;从中接收输入&#xff1b;同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 和以前相同&…

【深入解析】AI工作流中的HTTP组件:客户端与服务端执行的区别

在当今快速发展的技术环境中&#xff0c;AI工作流的设计和实现变得愈发重要。尤其是在处理HTTP组件时&#xff0c;前端执行与后端执行之间的区别&#xff0c;往往会对系统的安全性和数据的准确性产生深远的影响。今天&#xff0c;我们就来深入探讨这一话题&#xff0c;揭示前端…

音频基础学习四——声音的能量与分贝

文章目录 前言一、能量与分贝1.音频能量2.分贝3.两者的区别4. 应用场景 二、分贝的计算方式1.具体数学公式2.具体算法示例3.对于算法的释义大小端为什么通过计算得到的是负值范围实际结果 总结 前言 很多博客中经常会把声音的能量和分贝说成是一个东西&#xff0c;这种说法是错…

原型模式prototype

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/prototype 能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对…

云计算之云原生(上)

目录 一、消息队列RocketMQ 1.1 功能介绍 1.1.1 业务消息首选&#xff1a;消息队列 RocketMQ 1.1.2 【收发流量隔离约束】读写分离控制提高集群稳定性 1.1.3 【Dashboard 仪表盘】实时观测实例状态 1.1.4 【消息轨迹追踪】消息生命周期状态一目了然 1.1.5 【实时扩缩容】…

单点登录OAuth2.0

OAuth 2.0&#xff08;Open Authorization 2.0&#xff09;是OAuth协议的第二个版本&#xff0c;于2012年正式成为RFC 6749标准。在OAuth 2.0之前&#xff0c;OAuth 1.0版本已经为Web应用提供了一定程度的授权功能&#xff0c;但随着时间的推移&#xff0c;这些版本逐渐显露出一…

“Docker网络模式详解与应用“

目录 前言 Docker内置网络 bridge 基本概念 案例 工作原理 使用场景 host 基本概念 案例 工作原理 使用场景 none 基本概念 案例 &#xff01;&#xff01;&#xff01;大佬救命 container 基本概念 案例 自定义网络 自定义bridge 基本概念 案例 Docker…

界面控件KendoReact中文教程 - 如何创建动态进度条?

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求。现在我们非常自豪地宣布&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for React能够为客户提供更好的用户体验&#xff0c;并且能够更快地构建更好的应用程序。 KendoR…

树莓派外设驱动WiringPi库

树莓派外设驱动WiringPi库 文章目录 树莓派外设驱动WiringPi库一、树莓派安装WiringPi库二、WiringPi库的使用方法 一、树莓派安装WiringPi库 wiringPi库其实已经很熟悉了&#xff0c;在香橙派中大量使用过&#xff0c;这个库中集成了很多使用的功能性函数&#xff0c;树莓派安…

设计模式-行为型模式-状态模式

1.状态模式的定义 允许一个对象在其内部状态改变时改变他的行为&#xff0c;用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题&#xff0c;状态模式将一个对象的状态从该对象中分离出来&#xff0c;封装到专门的状态类中&#xff0c;使得对象的状态可以灵活变化&…

【STM32】GPIO输入实现按键控制LED

1.stm32cubemx配置 和上篇博客配置一样 2.代码编写 实现一个按键按下LED1亮&#xff0c;另一个按下LED灭 KEY1实现LED1亮&#xff0c;KEY2实现LED2灭 1.配置GPIOA,GPIOB时钟使能 2.配置GPIOB模式初始化 3.配置GPIOA模式初始化 基本和2一样&#xff0c;不一样的是按键使用的…

(详)Vue3 + Typescript 项目配置 eslint + prettier + husky + lint-staged

目录 1&#xff0c;前言1.1&#xff0c;eslint 和 prettier 的关系1.2&#xff0c;Node.js 版本的问题 1&#xff0c;eslint1.1&#xff0c;安装1.2&#xff0c;配置文件1.3&#xff0c;集成对 vue 文件的配置1.4&#xff0c;在 package.json 中添加命令 2&#xff0c;prettier…

【代码随想录训练营第42期 Day52打卡 - 岛屿问题2

目录 一、做题心得 二、题目与题解 题目一&#xff1a;卡码网 101. 孤岛的总面积 题目链接 题解&#xff1a;DFS 题目二&#xff1a;卡码网 102. 沉没孤岛 题目链接 题解&#xff1a;DFS 三、小结 一、做题心得 今天做题时间比较晚了&#xff0c;只打卡完成了岛屿问题…

条件生成模型 (conditional generation)

我们之前讲的 GAN 中的生 成器&#xff0c;它没有输入任何的条件&#xff0c;它只是输入一个随机的分布&#xff0c;然后产生出来一张图片。我们现 在想要更进一步的是希望可以操控生成器的输出&#xff0c;我们给它一个条件x&#xff0c;让他根据条件x跟 输入z 来产生输出y。那…

硬件-经典开机电路

文章目录 一&#xff1a;网友公司祖传的开机电路二&#xff1a;电路符号名称三&#xff1a;电路原理分析道友&#xff1a;对于利益相关的人&#xff0c;要展示你的实力和智力。对于利益不相关的人&#xff0c;展示你的礼貌就好。 一&#xff1a;网友公司祖传的开机电路 业务逻辑…

【二】TDEngine快速入门

TDEngine快速入门 目录 TDEngine深入理解 概述 一、核心概念解析 二、基本操作 三、可视化管理工具 总结 概述 TDEngine创始人在官方出品的书籍中写到&#xff1a;我观察到&#xff0c;无论是出行行业还是更广义的运输行业&#xff0c;以及分布式能源系统&#xff0c;都将…