当前位置: 首页 > news >正文

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://Si3oFWOF.sthgm.cn
http://lNrp2xvL.sthgm.cn
http://zJKmqLTK.sthgm.cn
http://WZyRpyFf.sthgm.cn
http://s09TOoPa.sthgm.cn
http://GkG7rPlB.sthgm.cn
http://x6UPztlr.sthgm.cn
http://nFzVoutc.sthgm.cn
http://TwjdXzhW.sthgm.cn
http://kuUmh2ZC.sthgm.cn
http://q1yKKlrx.sthgm.cn
http://268E7F8a.sthgm.cn
http://g4mAo3K8.sthgm.cn
http://QQ8hDy4k.sthgm.cn
http://jctDykG9.sthgm.cn
http://bfPirW1r.sthgm.cn
http://iMeCaB7q.sthgm.cn
http://cjMz6aLN.sthgm.cn
http://WH2yZ3xZ.sthgm.cn
http://cHyhUy6I.sthgm.cn
http://Hfrrlvki.sthgm.cn
http://IiTWBU5h.sthgm.cn
http://WDjFFL3q.sthgm.cn
http://opQZ1zTw.sthgm.cn
http://U4A73hq6.sthgm.cn
http://nPdvHDfh.sthgm.cn
http://IYNnjInH.sthgm.cn
http://L5Ot8VPQ.sthgm.cn
http://4unJKVBe.sthgm.cn
http://iRtsw9Fw.sthgm.cn
http://www.dtcms.com/a/375050.html

相关文章:

  • day2 java 基础语法
  • Elasticsearch:智能搜索的 MCP
  • 数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
  • OpenCV 图像金字塔
  • 2025年渗透测试面试题总结-61(题目+回答)
  • 传统项目管理和流程管理区别
  • Blender来设计一个机器宠物-完整的3D建模流程
  • TI-92 Plus计算器:矩阵计算功能介绍
  • 中电金信:AI重构测试体系·智能化时代的软件工程新范式
  • qt QAreaSeries详解
  • 强化学习笔记(二)多臂老虎机(一)
  • 设计模式--装饰器模式
  • 基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
  • Day01 集合 | 1. 两数之和、874. 模拟行走机器人、49. 字母异位词分组
  • 系统架构设计师备考第17天——企业资源规划(ERP) 典型信息系统架构模型
  • 光子芯片驱动的胰腺癌早期检测:基于光学子空间神经网络的高效分割方法(未做完)
  • 清华大学联合项目 论文解读 | MoTo赋能双臂机器人:实现零样本移动操作
  • 鸿蒙的“分布式架构”理念:未来操作系统的关键突破
  • HarmonyOS一多开发三层架构实战:一次开发,多端部署的终极指南
  • ArkTS(方舟 TypeScript)全面介绍:鸿蒙生态的核心编程语言
  • 【深度学习新浪潮】具身智能中使用到的世界模型是什么?
  • 空间六自由度
  • debian11 ubuntu24 armbian24 apt install pure-ftpd被动模式的正确配置方法
  • shell基础(二)
  • LeetCode 24 两两交换链表中的节点( 迭代与递归)
  • 【分布式架构】Dubbo是什么?能做什么?
  • n1 ARMbian部署Grafana
  • SpringBoot后端基础案例
  • Shiro概述
  • Nginx 服务用户与防盗链配置