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

数据结构--栈和队列

目录

一、栈的实现

1、栈

2、实现栈

二、队列的实现

1、队列

2、实现队列


一、栈的实现

1、栈

栈是一种特殊的线性表,它只允许在固定的一段进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。

压栈:栈的插入操作叫做压栈,插入的数据存放在栈顶。

出栈:栈的删除操作叫做出战,删除数据也是从栈顶开始删除。

2、实现栈

栈的实现可以使用数组也可以使用链表,相对而言数组更为合适。

首先便是创建一个以数组为底层的栈(栈的形式与顺序表相似,因为它们都是以数组为底层逻辑的)。

typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;		// 栈顶int capacity;  // 容量 
}Stack;

接下来就是对栈的初始化以及增删改查操作。

// 初始化栈 
void StackInit(Stack* ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}
// 入栈 
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : 2 * sizeof(STDataType);STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}ps->arr[ps->top++] = data;
}
// 出栈 
void StackPop(Stack* ps)
{assert(ps);assert(StackEmpty(ps));--ps->top;
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{assert(ps);assert(StackEmpty(ps));return ps->arr[ps->top - 1];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{if (ps->top == 0){return 0;}return -1;
}
// 销毁栈 
void StackDestroy(Stack* ps)
{assert(ps);if(ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}

二、队列的实现

1、队列

只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表,对列具有先入先出的特性。

2、实现队列

队列可以使用数组和链表的结构实现,相对来说使用链表会更优。

首先创建用于队列实现的两个结构体,分别是队列的数据域和指针域,以及分别指向队列的头和尾的指针。

typedef int QDataType;
// 链式结构:表示队列 
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构 
typedef struct Queue
{//指向队头的指针QNode* head;//指向队尾的指针QNode* tail;//有效数据个数int size;
}Queue;
// 初始化队列 
void QueueInit(Queue* q)
{assert(q);q->head = q->tail = NULL;q->size = 0;
}
// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* Node = (QNode*)malloc(sizeof(QNode));if (Node == NULL){perror("malloc");exit(1);}Node->data = data;Node->next = NULL;//只有一个节点的情况if (q->head == NULL){q->head = q->tail = Node;}else{q->tail->next = Node;q->tail = Node;}q->size++;
}
// 队头出队列 
void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QNode* Next = q->head->next;free(q->head);q->head = Next;q->size--;
}
// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->head->data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->tail->data;
}
// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{assert(q);return q->size;
}
// 检测队列是否为空,如果为空返回true,如果非空返回false
bool QueueEmpty(Queue* q)
{assert(q);return q->head == NULL && q->tail == NULL;
}
// 销毁队列 
void QueueDestroy(Queue* q)
{assert(q);assert(!QueueEmpty(q));QNode* pcur = q->head;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}q->head = q->tail = NULL;q->size = 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 乾元通多卡聚合技术在无人配送车应用领域通信保障方案
  • vue3+ts文件流导出xlsx表格需要token
  • Qt text-align和padding属性
  • SonarQube前后端代码质量分析实战
  • Electron桌面应用与文件路径处理:从Git、SourceTree到TortoiseGit的安装与配置
  • 【负载均衡】LoadBalance场景演示
  • JsonCpp库的使用
  • macOS 安装 Homebrew
  • 记录使用 xlsx 前端导出文件
  • App推广新篇章:Xinstall带你走出数据迷雾,实现高效推广!
  • ZTP(Zero Touch Provisioning)
  • 情侣点餐小程序(零基础小白)(零成本运营)
  • Python计算机视觉编程——第四章 照相机模型与增强现实
  • 用户变渠道,Xinstall引领手游推广新潮流
  • 【网络安全】服务基础第一阶段——第五节:Windows系统管理基础---- DHCP部署与安全
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • CSS中外联样式表代表的含义
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript实现分页效果
  • Java方法详解
  • Laravel Telescope:优雅的应用调试工具
  • leetcode-27. Remove Element
  • Node项目之评分系统(二)- 数据库设计
  • PHP的Ev教程三(Periodic watcher)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue实战(四)登录/注册页的实现
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对超线程几个不同角度的解释
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 深度解析利用ES6进行Promise封装总结
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • No resource identifier found for attribute,RxJava之zip操作符
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​TypeScript都不会用,也敢说会前端?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #pragma multi_compile #pragma shader_feature
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (11)MSP430F5529 定时器B
  • (2)nginx 安装、启停
  • (C语言)fread与fwrite详解
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (zhuan) 一些RL的文献(及笔记)
  • (办公)springboot配置aop处理请求.
  • (分布式缓存)Redis哨兵
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六)Flink 窗口计算
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)Linux网络编程入门
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .apk文件,IIS不支持下载解决
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 成都线下面基会拉开序幕