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

Linux学习-数据结构(栈和队列)

1.栈和队列

1.概念

  • 链表、栈和队列都是一种线性结构(一对一)
  • 栈和队列是一种特殊的表状结构
  • 栈只允许在栈顶位置入栈和出栈元素
  • 链表可以在任意位置插入和删除元素
  • 栈和队列只允许在指定位置插入和删除元素

2.栈

1.概念

  • 先进后出,后进先出
  • 栈顶:允许入栈和出栈的一段
  • 栈底:不允许允许入栈和出栈的一段
  • 入栈(压栈):将元素放入栈顶位置
  • 出栈(弹栈):将栈顶元素取出
  • 栈针:找出记录栈顶位置的标记

2.分类

顺序栈

  • 增栈:栈的增长方向自低向高增长
  • 减栈:栈的增长方向自高向低增长
  • 空栈:栈针指向入栈的位置
  • 满栈:栈针指向栈顶元素的位置

常见的顺序栈

1.空增栈

2.空减栈

3.满增栈

4.满减栈

顺序栈的实现

1.类型定义

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__typedef int datatype;typedef struck static{datatype *pdata;int top;int len;
}seqstack;#endif

2.创建顺序表

seqstack *creat_seqstack(int len)
{seqstack *ptmpstack = NULL;ptmpstack = malloc(sizeof(seqstack));if(ptmpstack == NULL){perror("fail to malloc");return NULL;}ptmpstack->pdata = malloc(sizeof(seqstack) * len);if(ptmpstack->pdata == NULL){perror("fail to malloc");return NULL;}ptmpstack->top = 0;ptmpstack->len = len;return ptmpstack;
}

3.顺序表的销毁

int destroy_seqstack(seqstack **pptmpstack)
{free((*pptmpstack)->pdata);free((*pptmpstack));*pptmpstack = NULL;return 0;
}

4.判断满栈、空栈

int Is_empty_seqstack(seqstack *ptmpstack)
{return ptmpstack->top == 0;
}int Is_full_seqstack(seqstack *ptmpstack)
{return ptmpstack->len == ptmpstack->top;
}

5.压栈和出栈

int entern_seqstack(seqstack *ptmpstack, datatype num)
{if(Is_full_seqstack(ptmpstack)){return -1;}ptmpstack->pdata[ptmpstack->top++] = num;return 0;
}datatype out_seqstack(seqstack *ptmpstack)
{if(Is_empty_seqstack(ptmpstack)){return -1;}return ptmpstack->pdata[--(ptmpstack->top)];
}

链式栈

  • 使用链表的思想实现链式栈
  • 参考单向链表定义类型

链式栈的实现

typedef int datatype;typedef struct node{datatype data;struct node *pnext;
}linknode;
/*创建空链式栈*/
linknode *creat_empty_linkstack(void)
{linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(ptmpnode == NULL){perror("fail to malloc");return NULL;}ptmpnode->pnext = NULL;return ptmpnode;
}/*判断是否为空栈*/
int is_empty_linkstack(linknode *phead)
{return phead->pnext == NULL;
}/*压栈*/
int push_linkstack(linknode *phead, datatype tmpdata)
{linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(ptmpnode == NULL){perror("fail to malloc");return -1;}ptmpnode->pnext = phead->pnext;ptmpnode->data = tmpdata;phead->pnext = ptmpnode;return 0;
}/*出栈*/
datatype out_linkstack(linknode *phead)
{linknode *pfreenode = NULL;datatype tmpdata;pfreenode = phead->pnext;tmpdata = pfreenode->data;phead->pnext = pfreenode->pnext;free(pfreenode);return tmpdata;
}/*销毁栈*/
int destroy_linkstack(linknode **pphead)
{linknode *pfreenode = NULL;linknode *ptmpnode = NULL;ptmpnode = pfreenode = *pphead;while(ptmpnode != NULL){ptmpnode = ptmpnode->pnext;free(pfreenode);pfreenode = ptmpnode;}*pphead = NULL;return 0;
}

3.队列

1.概念

  • 先进先出,后进后出
  • 队头:出队的一端
  • 队尾:入队的一段
  • 入队:将元素放入队列末尾
  • 出队:将元素从队头中取出

2.分类

  • 顺序队列
  • 链式队列

顺序队列

typedef int datatype;typedef struct queue{datatype *pdata;int head;int tail;int len;
}seqqueue;
#include "seqqueuee.h"
#include <stdio.h>
#include <stdlib.h>/*创建队列*/
seqqueue *creat_seqqueue(int len)
{seqqueue *ptmpqueue = NULL;ptmpqueue = malloc(sizeof(seqqueue));if(ptmpqueue == NULL){perror("fail to malloc");return NULL;}ptmpqueue->pdata = malloc(sizeof(seqqueue) * len);if(ptmpqueue->pdata == NULL){perror("fail to malloc");return NULL;}ptmpqueue->head = 0;ptmpqueue->tail = 0;ptmpqueue->len = len;return ptmpqueue;
}/*销毁队列*/
int destroy_seqqueue(seqqueue **pptmpqueue)
{free((*pptmpqueue)->pdata);free(*pptmpqueue);*pptmpqueue = NULL;return 0;
}/*判断是否为满*/
/*为避免循环队列空与满的条件冲突,牺牲一个存放数据的空间,将tail+1 == head作
为判断队满的条件
循环队列如果head或者tail下标超过tlen范围,需要对tlen取余,保障head和tail的
值在队列下标范围内变化*/
int is_full_seqqueue(seqqueue *ptmpqueue)
{return ptmpqueue->head == (ptmpqueue->tail + 1) % (ptmpqueue->len);
}int is_empty_seqqueue(seqqueue *ptmpqueue)
{return ptmpqueue->tail == ptmpqueue->head;
}/*判断队列是否为空*/
int enturn_data_seqqueue(seqqueue *ptmpqueue, datatype tmpdata)
{if(is_full_seqqueue(ptmpqueue)){return -1;}ptmpqueue->pdata[ptmpqueue->tail] = tmpdata;ptmpqueue->tail = (ptmpqueue->tail + 1) % ptmpqueue->len;return 0;
}/*出队*/
datatype out_seqqueue(seqqueue *ptmpqueue)
{datatype tmpdata;if(is_empty_seqqueue(ptmpqueue)){return -1;}tmpdata = ptmpqueue->pdata[ptmpqueue->head];ptmpqueue->head = (ptmpqueue->head + 1) % ptmpqueue->len;return tmpdata;
}

链式队列

typedef int datatype;typedef struct queue{datatype data;struct queue *pnext;
}linkqueue;
/*创建空队列*/
linkqueue *creat_empty_linkqueue(void)
{linkqueue *ptmpqueue = NULL;ptmpqueue = malloc(sizeof(linkqueue));if(ptmpqueue == NULL){perror("fail to malloc");return NULL;}ptmpqueue->pnext = NULL;return ptmpqueue;
}/*销毁队列*/
int destroy_linkqueue(linkqueue **pphead)
{linkqueue *ptmpqueue = NULL;linkqueue *pfreequeue = NULL;ptmpqueue = pfreequeue = *pphead;while(ptmpqueue != NULL){ptmpqueue = ptmpqueue->pnext;free(pfreequeue);pfreequeue = ptmpqueue;}return 0;
}/*判断是否为空队列*/
int is_empty_linkqueue(linkqueue *phead)
{return phead->pnext == NULL;
}/*入队*/
int enter_linkqueue(linkqueue *phead, datatype tmpdata)
{linkqueue *ptmpqueue = NULL;linkqueue *pinsterqueue = NULL;pinsterqueue = malloc(sizeof(linkqueue));if(pinsterqueue == NULL){perror("fail to malloc");return -1;}ptmpqueue = phead;while(ptmpqueue->pnext != NULL){ptmpqueue = ptmpqueue->pnext;}pinsterqueue->data = tmpdata;pinsterqueue->pnext = ptmpqueue->pnext;ptmpqueue->pnext = pinsterqueue;return 0;
}/*出队*/
datatype out_linkqueue(linkqueue *phead)
{linkqueue *ptmpqueue = NULL;datatype tmpdata;if(is_empty_linkqueue(phead)){return -1;}ptmpqueue = phead->pnext;tmpdata = ptmpqueue->data;phead->pnext = ptmpqueue->pnext;free(ptmpqueue);return tmpdata;
}
http://www.dtcms.com/a/318684.html

相关文章:

  • 8.6学习总结
  • Selenium在Pyhton应用
  • Java 大视界 -- Java 大数据机器学习模型在电商用户生命周期价值评估与客户关系精细化管理中的应用(383)
  • 应急响应排查(windows版)
  • Vue计算属性详解2
  • Python Pandas.lreshape函数解析与实战教程
  • 机器学习模型调优实战指南
  • 关于应急响应的那些事
  • 第14届蓝桥杯Scratch选拔赛初级及中级(STEMA)真题2023年3月12日
  • 人工智能-python-机器学习实战:特征降维、PCA与KNN的核心价值解析
  • Linux: NFS 服务部署与autofs自动挂载的配置
  • 分隔串处理方法
  • SQL注入SQLi-LABS 靶场less51-57详细通关攻略
  • 【2026版】JVM面试题
  • K8S的POD数量限制
  • 敏捷协作平台推荐:Jira、PingCode、Tapd等15款
  • C++ - 仿 RabbitMQ 实现消息队列--网络通信协议设计
  • 力扣-42.接雨水
  • 云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第二章
  • java 桌面应用程序基本框架
  • 【算法训练营Day21】回溯算法part3
  • C语言:指针(1-2)
  • 亚马逊新品实现快速起量:如何设置有效的广告竞价策略
  • Java保姆级新手教程第三章(方法与数组)
  • 亚马逊广告进阶指南:广告转化的基本原理
  • 前端性能优化实战:电商首页从 10s 加载到 1s 的踩坑与复盘
  • 大数据存储域——HDFS存储系统
  • 在LLM小型化趋势下,AI Infra需要做出哪些相应调整?
  • 用 “私房钱” 类比闭包:为啥它能访问外部变量?
  • 日记研究:一种深入了解用户真实体验的UX研究方法