Day04_数据结构(栈链栈循环队列)

01.栈

main.c

#include "stack.h"                               
int main()                                       
{                                                stack_p S=(stack_p)create_stack();           //1.入栈                                     printf("入栈数据1:\n");                      push_stack(S,1);                             show_stack(S);                               printf("入栈数据2:\n");                      push_stack(S,2);                             show_stack(S);                               printf("入栈数据3:\n");                      push_stack(S,3);                             show_stack(S);                               printf("入栈数据4:\n");                      push_stack(S,4);                             show_stack(S);                               printf("入栈数据5:\n");                      push_stack(S,5);                             show_stack(S);                               //2.出栈                                     printf("出栈数据1:%d\n",pop_stack(S));       show_stack(S);                               printf("出栈数据2:%d\n",pop_stack(S));       show_stack(S);                               //3.销毁栈                                   printf("销毁后数据:\n");                     destory(&S);                                 printf("%p\n",S);                            return 0;                                    
}                                                

stack.c

#include "stack.h"
//1、创建顺序栈
stack_p create_stack()
{stack_p S = (stack_p)malloc(sizeof(stack));if(S==NULL){return NULL;}bzero(S,sizeof(stack));  //把申请的所有空间都初始为0S->top = -1;  //-1是栈顶位置top的初始值return S;
}
//2、判空
int empty_stack(stack_p S)
{if(S==NULL){return -1;}return S->top==-1;
}
//3、判满
int full_stack(stack_p S)
{if(S==NULL){return -1;}return S->top==MAX-1;
}
//4、入栈
void push_stack(stack_p S,int value)
{if(S==NULL){return;}if(full_stack(S)){return;}//先加栈顶位置,再将元素压入栈//先加再压//S->data[++(S->top)] = value;S->top++;S->data[S->top] = value;
}
//5、出栈
int pop_stack(stack_p S)
{if(S==NULL){return -1;}if(empty_stack(S)){return -2;}return S->data[S->top--];
}
//6、输出栈中元素
void show_stack(stack_p S)
{if(S==NULL){return;}if(empty_stack(S)){return;}int i;for(i=S->top;i>=0;i--){printf("%d\n",S->data[i]);}
}
//7、销毁栈
/*void destory(stack_p S)
{if(S==NULL){return;}free(S); 
}*/
void destory(stack_p *S)
{if(S==NULL||*S==NULL){return;}free(*S);*S = NULL;
}
//7、销毁栈                          
void destory(stack_p *S)             
{                                    if(S==NULL||*S==NULL)            {                                printf("空栈无需销毁.\n");   return;                      }                                while(empty_stack(*S)==0){       pop_stack(*S);               }                                free(*S);                        *S=NULL;                         
}                                    

stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 7
typedef struct 
{int data[MAX];int top;  //记录栈顶元素的下标
}stack,*stack_p;
//1、创建顺序栈
stack_p create_stack();
//2、判空
int empty_stack(stack_p S);
//3、判满
int full_stack(stack_p S);
//4、入栈
void push_stack(stack_p S,int value);
//5、出栈
int pop_stack(stack_p S);
//6、输出栈中元素
void show_stack(stack_p S);
//7、销毁栈
void destory(stack_p *S);#endif

02.链栈

main.c

#include "link.h"
int main()
{node_p S=NULL;printf("入栈第一数:\n");push_stack(&S,1);show_stack(&S);printf("入栈第二数:\n");push_stack(&S,2);show_stack(&S);printf("入栈第三数:\n");push_stack(&S,3);show_stack(&S);printf("入栈第四数:\n");push_stack(&S,4);show_stack(&S);printf("出栈第一数:\n");printf("%d\n",pop_stack(&S));printf("出栈第一数:\n");printf("%d\n",pop_stack(&S));printf("入栈第五数:\n");push_stack(&S,100);show_stack(&S);return 0;
}

links.c

#include "link.h"
node_p create_node(int value)
{node_p new=(node_p)malloc(sizeof(node));if(new==NULL){printf("创建结点失败.\n");return NULL;}new->next=NULL;new->data=value;return new;
}
int empty_stack(node_p S)
{return S==NULL;
}//入栈操作需要修改主函数中栈顶指针的指向
void push_stack(node_p *S,int value)
{//S是一个二级指针,保存主函数内栈顶指针的地址if(S==NULL){return;}//不用判断*S,因为如果*S==NULL说明栈中没有元素node_p new = create_node(value);new->next = *S;  //新结点指向原来的栈顶元素*S = new;   //让主函数中的栈顶指针S指向新的栈顶结点
}
//出栈
int pop_stack(node_p *S)
{if(*S==NULL){return -1;}if(empty_stack(*S)){return -2;}int ret=(*S)->data;node_p del = *S;   //先保存栈顶结点*S = (*S)->next;   //让栈顶指针向后指一个结点free(del);   //释放栈顶元素return ret;}
//输出
void show_stack(node_p *S)
{if(S==NULL){printf("入参指针为空,无法操作.\n");return;}node_p p=*S;if(empty_stack(p)){printf("栈为空,没有值可以输出.\n");return;}printf("栈元素(从栈顶到栈底):\n");while(p!=NULL){printf("%d->",p->data);p=p->next;}printf("bottom\n");
}

links.h

#ifndef __LINK_H__
#define __LINK_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{int data;struct node *next;
}node,*node_p;node_p create_node(int value);
int empty_stack(node_p S);
void push_stack(node_p *S,int value);
int  pop_stack(node_p *S);
void show_stack(node_p *S);
#endif

03.循环队列

main.c

#include "queue.h"
int main()
{queue_p Q=(queue_p)create_que();printf("入队第一个数字:\n");push_que(Q,1);show(Q);printf("入队第二个数字:\n");push_que(Q,2);show(Q);printf("入队第三个数字:\n");push_que(Q,3);show(Q);printf("入队第四个数字:\n");push_que(Q,4);show(Q);printf("入队第五个数字:\n");push_que(Q,5);show(Q);printf("出队第1个数字:\n");pop_que(Q);show(Q);printf("出队第2个数字:\n");pop_que(Q);show(Q);printf("队列中元素个数:%d\n",cont_que(Q));printf("销毁前:");printf("%p\n",Q);destory(&Q);printf("销毁后:");printf("%p\n",Q);}

queue.c

#include "queue.h"//1.创建循环队列
queue_p create_que()
{queue_p Q=(queue_p)malloc(sizeof(queue));if(Q==NULL){printf("申请节点失败.\n");return NULL;}bzero(Q,sizeof(queue));Q->front=4;Q->front=Q->rear;return Q;
}
//2.判空
int empty_queue(queue_p Q)
{if(Q==NULL){printf("入参为空.\n");return -1;}return Q->front==Q->rear?1:0;
}
//3.判满
int full_queue(queue_p Q)
{if(Q==NULL){printf("入参为空.\n");return -1;}return (Q->rear+1)%MAX==Q->front?1:0;
}
//4.入队
void push_que(queue_p Q,int value)
{if(Q==NULL){printf("入参为空.\n");return;}if(full_queue(Q)){printf("队列已满,无法入队.\n");return;}Q->data[Q->rear]=value;Q->rear=(Q->rear+1)%MAX;
}
//5.出队
int pop_que(queue_p Q)
{if(Q==NULL){printf("入参为空.\n");return -1;}if(empty_queue(Q)){printf("队列为空,无法入队.\n");return -2;}int ret=Q->data[Q->front];Q->front=(Q->front+1)%MAX;return ret;
}
//6.从对头开始输出
void show(queue_p Q)
{if(Q==NULL){printf("入参为空.\n");return;}if(empty_queue(Q)){printf("队列为空,无法输出.\n");return;}int i=Q->front;while(i!=Q->rear){printf("%-3d",Q->data[i]);i=(i+1)%MAX;}putchar(10);
}
//7.返回队列中元素的个数
int cont_que(queue_p Q)
{if(Q==NULL){printf("入参为空.\n");return -1;}return (Q->rear-Q->front+MAX)%MAX;}//8.销毁队列
void destory(queue_p *Q)
{if(Q==NULL||*Q==NULL){printf("队列为空.\n");return;}free(*Q);*Q=NULL;}

queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 8
typedef struct {int data[MAX];int front;int rear;
}queue,*queue_p;queue_p create_que();
int empty_queue(queue_p Q);
int full_queue(queue_p Q);
void push_que(queue_p Q,int value);
int pop_que(queue_p Q);
void destory(queue_p *Q);
void show(queue_p Q);
int cont_que(queue_p Q);#endif

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

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

相关文章

PyTorch 的 CUDA GPU 支持 · 安装五条铁律(最新版 2025 修订)(适用于所有用户)

相关参考资料&#xff08;往期博客&#xff09;&#xff1a; 是否需要预先安装 CUDA Toolkit&#xff1f;——按使用场景分级推荐及进阶说明-CSDN博客 太方便&#xff0c;WIN系统CUDA12.4下使用conda便捷管理虚拟环境中的不同版本的CUDA、cuDNN、PyTorch-CSDN博客 好消息&#…

Django构建简易视频编辑管理系统

Django构建简易视频编辑管理系统 以下是基于Django构建简易视频编辑管理系统的可运行代码框架&#xff0c;包含核心功能模块和实现逻辑。该系统支持视频上传、基本剪辑操作和管理功能。 环境准备 安装必要依赖包&#xff1a; pip install django pillow moviepy django-cri…

Java求职者面试题详解:计算机网络、操作系统、设计模式与数据结构

Java求职者面试题详解&#xff1a;计算机网络、操作系统、设计模式与数据结构 第一轮&#xff1a;基础概念问题 1. 请解释TCP和UDP的区别。 2. 什么是操作系统&#xff1f;它的主要功能是什么&#xff1f; 3. 请解释设计模式中的单例模式&#xff0c;并给出一个实际应用的例…

【mysql】docker运行mysql8.0

背景 mariadb10.5.8报错&#xff1a;Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘LIMIT ?’ at line 1 所以更换为mysql8.0.39试试 docker run启动…

C#实现语音预处理:降噪/静音检测/自动增益

无论是在音视频录制系统&#xff0c;还是音视频通话系统、或视频会议系统中&#xff0c;对从麦克风采集到的说话的声音数据进行预处理&#xff0c;都是是非常必要的。 语音数据预处理主要包括&#xff1a;​​降噪&#xff08;Noise Reduction&#xff09;、静音检测&#xff0…

组合模式Composite Pattern

模式定义 又称整体-部分模式 组合多个对象形成 树形结构 以表示“整体-部分”的结构层次 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性对象结构型模式 模式结构 Component&#xff1a;抽象构件Leaf&a…

商代大模型:智能重构下的文明曙光与青铜密码

引言&#xff1a;技术奇点的历史想象 在人类文明的长河中&#xff0c;技术的进步始终是推动社会变革的核心动力。从青铜冶炼到文字发明&#xff0c;从农业革命到工业革命&#xff0c;每一次技术飞跃都重塑了人类对世界的认知与生存方式。而如今&#xff0c;人工智能的崛起正以…

【Python】python系列之函数作用域

Python 系列文章学习记录&#xff1a; Python系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客 Python系列之变量和运算符_开着拖拉机回家的博客-CSDN博客 Python系列之判断和循环_开着拖拉机回家的博客-CSDN博客 Python系列之字符串和列表_开着拖拉机回家的博客…

Unity UI 核心类解析之Graphic

&#x1f9f1; Unity UI 核心类解析&#xff1a;Graphic 类详解 一、什么是 Graphic&#xff1f; 在 Unity 的 UI 系统中&#xff0c;Graphic 是一个抽象基类&#xff0c;继承自 UIBehaviour 并实现了 ICanvasElement 接口。它是所有可以被绘制到屏幕上的 UI 元素的基础类。 …

【Elasticsearch】文档迁移(Reindex)

文档迁移 1.为什么要进行 reindex 操作2.Reindex 操作的本质3.实际案例3.1 同集群索引之间的全量数据迁移3.2 同集群索引之间基于特定条件的数据迁移3.2.1 源索引设置检索条件3.2.2 基于 script 脚本的索引迁移3.2.3 基于预处理管道的数据迁移 3.3 不同集群之间的索引迁移3.4 查…

WordPress 区块版面配置指南

WordPress 的区块编辑器(Gutenberg)提供了灵活的版面配置选项&#xff0c;以下是主要配置方法&#xff1a; 基本区块布局 添加区块&#xff1a;点击””按钮或按”/”键快速插入区块 常用内容区块&#xff1a; 段落(Paragraph) 标题(Heading) 图像(Image) 画廊(Gallery)…

TensorFlow基础之理解张量

2.理解张量 张量&#xff08;Tensors&#xff09;介绍 张量是物理和工程领域的基础数学结构。但是过去张量很少在计算机科学里使用。它与离散数学和逻辑学有更多的联系。随着机器学习的出现&#xff0c;这种状态开始显著的改变&#xff0c;成为连续向量的计算基础。现代机器学…

Flume 安装与配置步骤

1.解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz 2.配置环境变量 vim /etc/profile export FLUME_HOME/home/wang/soft/flume/apache-flume-1.9.0-bin export PATH$PATH:$FLUME_HOME/bin source /etc/profile 3.创建必要的目录 mkdir -p $FLUME_HOME/conf 4.创建 Flume 配置文…

还原线上 WebView 异常:手机端APP远程调试

前端调试总被理解为开发阶段的事&#xff0c;但在实际项目中&#xff0c;真正困难的调试往往发生在产品上线之后。用户反馈“看不到内容”、“一直转圈”、“点了没反应”&#xff0c;而开发环境无法复现&#xff0c;测试机也正常运行&#xff0c;这时怎么定位、验证和解决问题…

102页满分PPT | 汽车设备制造业企业信息化业务解决方案智能制造汽车黑灯工厂解决方案

这份文档是一份汽车设备制造业企业信息化业务解决方案&#xff0c;详细阐述了企业从生产到销售的全流程信息化建设。针对企业目前手工管理为主、信息化程度低、数据追溯困难等问题&#xff0c;提出了建立统一信息化平台的目标&#xff0c;涵盖财务、业务、流程和数据的整合。方…

SQLite 表达式详解

SQLite 表达式详解 引言 SQLite 是一个轻量级的数据库,广泛用于移动设备和桌面应用程序。SQLite 的表达式是 SQL 语句的核心,它们用于查询、更新和删除数据库中的数据。本文将详细解释 SQLite 的各种表达式,并探讨它们在数据库操作中的重要性。 表达式概述 在 SQLite 中…

沉浸式AI交互数字人技术解析

360智汇云沉浸式AI交互数字人支持开发者灵活接入和私有化部署大模型服务&#xff0c;构建面向业务场景的实时音视频交互能力。系统集成了360智汇云自研的沉浸式AI交互数字人引擎与高性能 RTC 模块&#xff0c;保障音视频传输过程中的低延迟、高稳定性和高并发承载能力&#xff…

HarmonyOS 评论回复弹窗最佳实践

HarmonyOS 评论回复弹窗最佳实践 前言 在移动应用开发中&#xff0c;评论回复功能是一个常见且重要的交互场景。本文将详细介绍如何在 HarmonyOS 中实现一个功能完善的评论回复弹窗&#xff0c;包括弹窗选型、富文本编辑、软键盘适配等关键技术点。 功能概述 我们要实现的评…

Git 回退操作详解:带示例的“小白”指南

前言 在日常开发中&#xff0c;我们难免会遇到&#xff1a; 改错代码&#xff1a;推送之前才发现某些行根本就不该动提交错误&#xff1a;commit 信息打错、提交到错误分支想回到之前版本&#xff1a;测试时发现之前版本是好的&#xff0c;需要回去查看 这就需要用到 Git 的…

redux以及react-redux

1.redux案例完整版 上一篇文章我们是没有action文件&#xff0c;直接在countre组件与store以及reducer直接进行状态的改变以及展示。 下面我们加上action文件&#xff0c;我们就不能直接通过dispatch传&#xff0c;而是通过调用action里面的函数讲我们传入的参数变成action这种…