4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案

栈和队列

1. 栈

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作 的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。

底层结构选型 栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊ 数据的代价⽐较⼩。

栈的实现

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDataType;typedef struct Stack
{STDataType* PST;int top;int capasity;
}Stack;typedef struct MyQueue {Stack pushst;Stack popst;
} MyQueue;
//栈的实现
void StackInit(Stack* ST);
void StackDestroy(Stack* ST);
void StackPush(Stack* ST, STDataType x);
void StackPop(Stack* ST);
void StackPrint(Stack* ST);
int StackIsEmpty(Stack* ST);
STDataType StackTop(Stack* ST);
#include"Stack.h"
//栈的实现
void StackInit(Stack* ST)
{assert(ST);ST->capasity = 4;ST->top = 0;ST->PST =(STDataType*)malloc(sizeof(STDataType)*4);
}
int StackIsEmpty(Stack* ST)
{assert(ST);if (ST->top == 0) {return 1;}else {return 0;}
}
void StackDestroy(Stack* ST)
{assert(ST);free(ST->PST);ST->capasity = 0;ST->top = 0;ST->PST = NULL; 
}
void StackPush(Stack* ST, STDataType x)
{assert(ST);if (ST->top == ST->capasity) {STDataType* temp = (STDataType*)realloc(ST->PST, sizeof(STDataType) * 2 * ST->capasity);if (temp == NULL) {printf("realloc failed\n");exit(1);}ST->PST = temp;ST->capasity = 2 * ST->capasity;}ST->PST[ST->top] = x;ST->top++;
}
void StackPop(Stack* ST)
{assert(ST);if (ST->top) {ST->top--;}
}
void StackPrint(Stack* ST)
{assert(ST);for (int i = 0; i < ST->top; i++){printf("%d ", ST->PST[i]);}printf("top:%d capacity:%d", ST->top,ST->capasity);printf("\n");
}STDataType StackTop(Stack* ST)
{assert(ST);assert(ST->top);return ST->PST[ST->top-1];
} 

最小栈(栈实战应用)

包含min函数的栈牛客题霸牛客网

//解题思路:1 再搞一个栈2来存储当前栈1中最小的元素,栈2的栈顶元素就是当前栈1中的最小元素,当栈1最小元素出栈时,栈2也要跟着出栈
2 不要额外栈,把栈存储的元素类型改为pair类型<栈元素,当前元素到栈底的最小元素>
class Solution {
public:void push(int value) {if(s1.empty()){s1.push({value,value});}else {if(value<=s1.top().second){s1.push({value,value});}else {s1.push({value,s1.top().second});}}}void pop() {s1.pop();}int top() {return s1.top().first;}int min() {return s1.top().second;}stack<pair<int,int>> s1;
};

2. 队列

概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out) ⼊队列:进⾏插⼊操作的⼀端称为队尾 出队列:进⾏删除操作的⼀端称为队头

队列的实现

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int QNDataType;
typedef struct QueueNode {struct QueueNode* next;QNDataType data;}QN;typedef struct Queue {QN* head;QN* tail;
}Queue;void QueueInit(Queue* Qe);
void QueuePrint(Queue* Qe);
void QueuePush(Queue* Qe, QNDataType x);//队尾入
void QueuePop(Queue* Qe);//队头出
QNDataType QueueFront(Queue* Qe);//取队头数据
QNDataType QueueBack(Queue* Qe);//取队尾数据
int QueueSize(Queue* Qe);//取队列大小
int QueueIsEmpty(Queue* Qe);//判断队列是否为空
void QueueDestroy(Queue* Qe);
#include"Queue.h"void QueueInit(Queue* Qe)
{Qe->head = NULL;Qe->tail = NULL;
}
void QueueDestroy(Queue* Qe)
{assert(Qe);QN* cur = Qe->head;while (cur != NULL) {QN* next = cur->next;free(cur);cur = next;}Qe->tail = Qe->head = NULL;}
int QueueIsEmpty(Queue* Qe)//判断队列是否为空
{assert(Qe);return Qe->head == NULL;}
void QueuePrint(Queue* Qe)
{assert(Qe);QN* cur = Qe->head;while (cur!= NULL) {printf("%d ", cur->data);cur = cur->next;}printf("\n");
}
void QueuePush(Queue* Qe, QNDataType x)
{assert(Qe);QN* temp = (QN*)malloc(sizeof(QN));if (temp == NULL) {printf("malloc failed\n");exit(-1); }temp->data = x;temp->next = NULL;if (Qe->tail == NULL) {//第一次入数据Qe->head = temp;Qe->tail = temp;}else {//第二次Qe->tail->next = temp;Qe->tail = temp;}
}
void QueuePop(Queue* Qe)
{assert(Qe);assert(Qe->head);if (Qe->head->next == NULL) {//只有一个节点的时候出数据free(Qe->head);Qe->head = Qe->tail = NULL;}else {//多节点出数据QN* next = Qe->head->next;free(Qe->head);Qe->head = next;}
}QNDataType QueueFront(Queue* Qe)//取队头数据
{assert(Qe);assert(Qe->head);//判断队头为空return Qe->head->data;
}QNDataType QueueBack(Queue* Qe)//取队尾数据
{assert(Qe);assert(Qe->head);//判断队头为空return Qe->tail->data;
}int QueueSize(Queue* Qe)//取队列大小
{assert(Qe);QN* cur = Qe->head;int size = 0;while (cur!=NULL) {size++;cur = cur->next;}return size;}

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

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

相关文章

Milvus基于docker主机外挂实践

一、安装docker与我之前写的原博客&#xff1a;ubuntu安装milvus向量数据库&#xff0c;获取key不同&#xff0c;原博客获取key已经过时# 更新Ubuntu软件包列表和已安装软件的版本: sudo apt update# 安装Ubuntu系统的依赖包 sudo apt-get install ca-certificates curl gnupg …

使用python test测试http接口

使用python test测试http接口获取token和控制session&#xff0c;后面大多数接口要带上这些信息 import time import requestsfrom common.aes_algorithm import AES from config.config import Config from config.log import logclass Common:username "admin"pas…

平时只会CRUD,没有高质量项目经验,我该怎么办

我没有项目经验怎么办 首先&#xff0c;不管是应届生还是社招几年工作经验的朋友&#xff0c;除非特别厉害的人&#xff0c;大家都会遇到这个问题。 我们该怎么处理&#xff0c;关注hikktn&#xff01;为你解答这个问题。 问AI世面上那个大厂程序员项目推荐 为什么这么说呢&…

网编.hw.9.10

云盘下载#include <myhead.h> #define SER_IP "192.168.108.93" #define SER_PORT 69 #define addr "192.168.109.6" #define port 8888/******************主程序******************/ int main(int argc, const char *argv[]) {//1、创建一个用于通…

Java调用magic-api中post接口参数问题

Java调用magic-api中post接口参数问题magic官方文档中只提供了get写法解决方法magic官方文档中只提供了get写法 实测使用官方写法调用get接口可调通&#xff0c;参数正常获取&#xff0c;但更换为post写法后&#xff0c;magic脚本中body获取为空 Autowired MagicAPIService s…

《sklearn机器学习——管道和复合估计器》联合特征(FeatureUnion)

超详细解说 sklearn 中的联合特征&#xff08;FeatureUnion&#xff09; 1. FeatureUnion 简介 FeatureUnion 是 scikit-learn 中的一个工具&#xff0c;用于并行地组合多个特征提取器的输出。它允许你将不同的特征提取方法&#xff08;如文本向量化、数值特征缩放、自定义特征…

Eyeshot 2025.3 3D 图形工具包

Eyeshot 2025.3 现在支持 E57 格式Eyeshot 2025.3 现在支持 E57 格式&#xff0c;可直接从 3D 扫描系统导入点云、图像和元数据。Eyeshot 由 devDept 开发&#xff0c;是一款功能全面的 3D 图形工具包&#xff0c;专为构建工程和 CAD(计算机辅助设计)应用程序的 .NET 开发人员而…

OpenResty 配合 Lua 脚本的使用

OpenResty 配合 Lua 脚本的使用实践 在高并发互联网服务中&#xff0c;传统的 Web 服务器往往难以同时兼顾性能与灵活性。而 OpenResty 作为一个基于 Nginx LuaJIT 的高性能 Web 平台&#xff0c;能够让我们在保持 Nginx 高并发性能的同时&#xff0c;使用 Lua 脚本 动态扩展其…

香港券商櫃台系統發展分析與市場觀察

香港券商櫃台系統發展分析與市場觀察 一、市場環境與交易機制變革 2025年以來&#xff0c;香港證券市場表現活躍。港交所現貨市場平均每日成交金額達2,402億港元&#xff0c;同比增長118%。南向交易&#xff08;港股通&#xff09;日均成交額佔比提升至23%&#xff0c;單日淨…

AR技术:多行业数字化转型的加速引擎

在数字化浪潮的推动下&#xff0c;增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术正突破传统娱乐和游戏领域的局限&#xff0c;成为各行业数字化转型的重要力量。从工业制造到医疗健康&#xff0c;从教育培训到零售购物&#xff0c;AR技术以其独特的虚实融合能力&…

第6篇、Kafka 高级实战:生产者路由与消费者管理

Kafka 高级实战&#xff1a;生产者路由与消费者管理&#xff08;Python 版&#xff09;从基础到进阶&#xff1a;深入理解 Kafka 的生产者消息路由、消费者 Offset 管理&#xff0c;以及 Exactly-Once 语义实现 实战导向&#xff1a;提供完整的可运行代码示例&#xff0c;涵盖自…

基于Python读取多个excel竖向拼接为一个excel

在Python中&#xff0c;可以使用pandas库结合glob模块来遍历读取多个Excel文件&#xff0c;并将它们竖向拼接为一个DataFrame对象。以下是完整的实现方法&#xff1a; 文章目录方法1&#xff1a;使用glob匹配文件 pd.concat()方法2&#xff1a;使用列表推导式&#xff08;更简…

Linux《进程信号(下)》

在之前的Linux《进程信号&#xff08;上&#xff09;》当中我们已经了解了进程信号的基本概念以及知道了信号产生的方式有哪些&#xff0c;还了解了信号是如何进行保存的&#xff0c;那么接下来在本篇当中就将继续之前的学习了解信号是如何处理的。除此之外还会了解到中断的概念…

android 性能优化—ANR

ANR产生原理ANR&#xff08;Application Not Responding&#xff09;是 Android 对 “应用主线程卡死” 的系统级保护机制&#xff1a; 当 输入事件、广播、服务 等在规定时间内未被处理完毕&#xff0c;SystemServer 会弹框并杀进程&#xff0c;防止整个系统跟着假死。计时起点…

stm32——单总线,DHT11

目录 一、单总线协议的原理和应用 单总线协议指的是只采用一根信道来进行数据传输&#xff0c;通信指的是双方&#xff08;MCU与传感器&#xff09;通过一根信道进行数据交互&#xff0c;所以按照数据的传输方向&#xff0c;只能采用半双工通信方式&#xff0c;比较典型的传感器…

css3之grid布局

容器&#xff1a;gird container开启grid布局的元素 项目&#xff1a;grid items容器里面的子元素&#xff0c;不包括后代元素 显式网格&#xff08;单元格&#xff09;&#xff1a;通过grid-template-columns和grid-template-rows指定的网格&#xff0c;注意项目不等于单元格,…

C++容器:list

一、list的介绍及使用 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

STL库——map/set(类函数学习)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言&#xff1b; 文章目录 前言 一、序列式容器和关联式容器 二、set 系列的使用 2.1、set 和 multiset 参考文档 2.2、set…

计算机网络IP协议

1.TCP协议1.1 确认应答1.2 超时重传1.3 连接管理1.4 滑动窗口1.5 流量控制1.6 拥塞控制 1.7 延时应答1.8 稍带应答1.9 粘包问题1.10 异常情况2.IP协议 网络层2.1 NAT机制下的几种情况:同一个局域网中,内网ip访问 内网 ip,可以的不同局域网中,内网IP访问 内网IP,不行~~外网IP访…

Windows电脑如何查看wifi连接记录及连接时间

查询WIFI 连接的记录 echo netsh wlan show profiles netsh wlan show wlanreport POWERSHELL 脚本 Get-WinEvent -LogName Microsoft-Windows-WLAN-AutoConfig/Operational | Where-Object { $_.Id -in (8001,8002) } | Select-Object TimeCreated, Id, {Name"Action…