栈与队列(c语言实现)
栈就像叠猫猫,遵循"先入后出"的原则;队列就像猫猫排队,遵循”先入先出“的原则。栈和队列均可以通过数组(顺序表)和链表(链表)来实现。
1.栈
栈的主要操作可以分为以下几种:
| 方法 | 描述 | 时间复杂度 |
|---|---|---|
| push() | 元素入栈(添加至栈顶) | O(1) |
| pop() | 栈顶元素出栈 | O(1) |
| peek() | 访问栈顶元素 | O(1) |
1.1基于数组实现栈
1.1.1定义栈的结构体
typedef int ElemType;
typedef struct {
ElemType* data;
int length;
}SqStack;
1.1.2栈的初始化
SqStack *InitStack() {
SqStack* stack = malloc(sizeof(SqStack));
stack->data = (ElemType*)malloc(sizeof(ElemType)*Max_Size);
stack->length = 0;
return stack;
}
1.1.3栈的释放
//栈的释放
void DestoryStack(SqStack* stack) {
free(stack->data);
free(stack);
}
1.1.4元素入栈
void push(SqStack* stack,ElemType e) {
if(stack->length == Max_Size) {
printf("栈满!\n");
return;
}
stack->data[stack->length++] = e;
}
stack->data[stack->length++] = e;:如果栈未满,将元素e存储在栈的当前位置(由stack->length指示),然后增加stack->length的值,表示栈中元素的数量增加了。
1.1.5元素出栈
//元素出栈
ElemType pop(SqStack* stack) {
if (stack->length == 0) {
printf("栈空!\n");
return -1;
}
return stack->data[stack->length--];
}
1.1.6访问栈顶元素
//访问栈顶元素
ElemType peek(SqStack* stack) {
if(stack->length == 0) {
printf("栈空!\n");
return -1;
}
return stack->data[stack->length-1];
}
1.2基于链表实现栈
1.2.1链表的结构体定义
typedef int ElemType;
//定义链表结构体
typedef struct StackNode{
ElemType* data;
struct StackNode* next;
}StackNode, *LinkStackPtr;
//定义栈的结构体
typedef struct {
StackNode* top;
int length;
}LinkStack;
1.2.2初始化栈
//初始化栈
LinkStack* InitStack() {
LinkStack* s = malloc(sizeof(LinkStack));
if (s == NULL) {
printf("内存分配失败!\n");
return NULL;
}
s->top = NULL;
s->length = 0;
return s;
}
1.2.3销毁栈
//销毁栈
void DestroyStack(LinkStack* s) {
//由栈顶到栈底,逐次释放
while (s->top) {
StackNode *n = s->top;
free(n);
s->top = s->top->next;
}
free(s);
}
1.2.4元素出栈
//元素出栈
ElemType pop(LinkStack* s) {
StackNode *node = malloc(sizeof(StackNode));
node->data = s->top->data;//将元素复制到node链表
StackNode *tmp = s->top;
s->top = s->top->next;//这里将top更新
free(tmp);
s->length--;
return node->data;
}
1.2.5访问栈顶元素
//访问栈顶元素
ElemType peek(LinkStack* s) {
if(s->length == 0) {
printf("栈空");
return -1;
}
return s->top->data;
}
2.队列
为了实现队列,我们需要一种数据结构,可以在一端添加元素,并在另一端删除元素,链表和数组都符合要求。
2.1基于数组的队列
2.1.1队列的结构体定义
//结构体定义
typedef int ElemType;
typedef struct {
ElemType* data;
ElemType front; //队首指针
ElemType end; //队尾指针
int length; //队列长度
}ArrayQueue;
2.1.2队列的初始化
//队列的初始化
ArrayQueue *InitQueue(int queCapcity) {
ArrayQueue* queue = (ArrayQueue*)malloc(sizeof(ArrayQueue));
queue->length = queCapcity;
queue->front = queue->end = 0;
queue->data = (ElemType*)malloc(sizeof(ElemType)*queue->length);
return queue;
}
2.1.3销毁队列
//销毁队列
bool DestoryQueue(ArrayQueue* queue) {
free(queue->data);
free(queue);
return true;
}
2.1.4入队
//入队
void push(ArrayQueue* queue,ElemType e) {
if(queue->length == queue->end) {
printf("队满");
return;
}
int rear = (queue->front + queue->end) % queue->length;
queue->data[rear] = e;
queue->end++;
}
2.1.5访问队首元素
//访问队首元素
ElemType geek(ArrayQueue* queue) {
return queue->data[queue->front];
}
2.1.6出队
//出队
ElemType pop(ArrayQueue* queue) {
ElemType num = peek(queue);
queue->front = (queue->front + 1) % queue->length;
return num;
}
2.2基于链表的队列
2.1.1队列结构体的定义
我们可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”,规定队尾仅可添加节点,队首仅可删除节点。
typedef int ElumType;
typedef struct Linklist{
ElumType* data;
struct Linklist* next;
}LNode;
typedef struct {
LNode *front,*rear;
int quelength;
}LinkListQueue;
2.1.2队列初始化
//队列的初始化
LinkListQueue* InitLinkListQueue() {
LinkListQueue* queue = (LinkListQueue*)malloc(sizeof(LinkListQueue));
queue->front = NULL;
queue->rear = NULL;
queue->quelength = 0;
return queue;
}
2.1.3队列的删除
//队列的删除
void DestroyLinkListQueue(LinkListQueue *queue) {
while (queue->front != NULL) {
LNode* temp = queue->front;
queue->front = queue->front->next;
free(temp);
}
free(queue);
}
2.1.4元素入队
//入队
bool push(LinkListQueue* queue,ElumType e) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = e;
//队列为空,头尾指针都指向node
if(queue->quelength == 0) {
queue->front = node;
queue->rear = node;
queue->quelength++;
}
else {
queue->rear->next = node;
queue->rear = node;
queue->quelength++;
}
return true;
}
2.1.5访问队首元素
//访问队首元素
ElumType peek(LinkListQueue* queue) {
if(queue->quelength == 0) {
printf("队空!\n");
return -1;
}
return queue->front->data;
}
2.1.6出队
//出队
ElumType pop(LinkListQueue* queue) {
ElumType num = peek(queue);
LNode *tmp = queue->front;
queue->front = queue->front->next;
free(tmp);
queue->quelength--;
return num;
}
以上是栈与队列的一些基本操作,原版代码上传至(https://gitee.com/shi-chengfu)
如果有错误请联系QQ:303613518
栈与队列(c语言实现)的更多相关文章
- 4-29 c语言之栈,队列,双向链表
今天学习了数据结构中栈,队列的知识 相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO). 首先看一下栈(St ...
- <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现
栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...
- C语言数据结构——第三章 栈和队列
三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- C语言数据结构基础学习笔记——栈和队列
之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...
- 数据结构(C语言版)-第3章 栈和队列
3.1 栈和队列的定义和特点3.2 案例引入3.3 栈的表示和操作的实现3.4 栈与递归3.5 队列的的表示和操作的实现3.6 案例分析与实现 基本操作有入栈.出栈.读栈顶元素值.建栈.判断栈满.栈空 ...
- C++学习(三十)(C语言部分)之 栈和队列
数据结构1.保存数据 2.处理数据数组+操作增查删改 栈和队列是一种操作受限的线性表 栈 是先进后出 是在一端进行插入删除的操作--->栈顶 另一端叫做栈底(栈和栈区是两个概念)(是一种数据结构 ...
- 栈和队列ADT -数据结构(C语言实现)
数据结构与算法分析 栈模型 限制插入和删除只能在表的末端的表 表的末端叫做栈顶(top) 支持Push进栈和Pop入栈操作 //LIFO后进先出表 栈的实现 链表实现 类型声明 struct Node ...
- 数据结构(c语言版,严蔚敏)第3章栈和队列
第3章栈和队列
- LeetCode 232题用栈实现队列(Implement Queue using Stacks) Java语言求解
题目链接 https://leetcode-cn.com/problems/implement-queue-using-stacks/ 题目描述 使用栈实现队列的下列操作: push(x) -- 将一 ...
随机推荐
- baselines中环境包装器EpisodicLifeEnv的分析
如题: class EpisodicLifeEnv(gym.Wrapper): def __init__(self, env): """Make end-of-life ...
- 英雄钢笔359色 EF尖 与 凌美(LAMY) 狩猎者 磨砂黑EF尖——长期使用对比
首先说明一下,这两个钢笔我都是长期使用了,凌美用了两三年了,英雄的那个用了也快半年了. 两款钢笔细节: 英雄:https://item.jd.com/1002650.html 凌美钢笔:https:/ ...
- quartz监控日志(一)
最近几个月,现网总是出现定时器不执行的情况,或者定时器卡死的情况,而又不方便排查,只能依靠quartz的debug日志以及错误日志来监控定时器的执行情况,并且随着我们系统中job越来越多,而使得job ...
- C#读写图片文件到Access数据库中
今天学习了把图片文件读写到数据库中,我是用的Access数据库,SQL还没去测试,不过都差不多 数据库表的样式 练习嘛就随便弄了下,说明下图片转成的字符串要用备注类型才可以哦 如果用的Sql数据库的话 ...
- 省钱的开源项目「GitHub 热点速览」
本期,我从上周的热门开源项目中挑选了 5 个既省钱又省事,还好玩的开源项目. 首先,推荐的是省钱的电动汽车智能充电管理平台 evcc,它可以根据分时电价智能安排电动车充电时间,从而降低电费,如果你家还 ...
- windows服务器使用 azure devops 批量自动发布网站到IIS
最近由于一个API项目,需要利用负载均衡来做支撑,因此需要将同一份代码分发到多个服务器,之前一直手工干这个活,感觉太累了,去开发交流群,还有搜索了一下资料,发现很多人推荐我用ftp.还有磁盘共享等这种 ...
- 使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用
简介 在现代微服务架构中,服务发现(Service Discovery)是一项关键功能.它允许微服务动态地找到彼此,而无需依赖硬编码的地址.以前如果你搜 .NET Service Discovery, ...
- 【转】git常用操作
创建版本库 git clone url 克隆远程版本库 git init 初始化本地版本库 配置 git config --global user.name 'chengcp' 配置global级别的 ...
- Angular 18+ 高级教程 – Angular Compiler (AKA ngc) Quick View
前言 在 Get Started 那一篇,我们提到过 Angular Compilation.这篇稍微给点具体画面,让大家感受一下. 但不会讲细节,对细节感兴趣的可以看这篇 Medium – How ...
- QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家
QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家 以下是<< QT5原理与源码分析视频课程>>的完整目录. 第1章 准备 第1节 您可以学到什么? 第2 ...