栈和队列

  • 栈:是一种特殊的线性表,其只允许在其固定的一段进行插入或者删除元素等操作;进行插入或者删除的一段称为栈顶,另一端称为栈顶;

  • 栈的特性:

    先进先出
    后进后出

栈的构造(C语言实现)

1. 静态栈的构造(栈的容量不能改变)
2. 动态栈的构造(栈的容量可以改表)
//静态栈的构造就是定义一个静态的顺序表
typedef struct Stack {int array[100];int size;} Stack;
//动态栈的构造
typedef int STDataType; typedef struct Stack {STDataType* _a;int _top; // 栈顶int _capacity;  // 容量
}Stack;

栈的初始化与销毁

  1. 栈的初始化
void StackInit(Stack* s) {s->size = 0;
}
  1. 栈的销毁
void StackDestory(Stack* s){s->size = 0;
}

栈的插入、删除、返回栈顶元素、栈内元素个数、检查栈是否为空栈

  1. 栈的插入也叫入栈
//插入void StackPush(Stack* s,int v) {s->array[s->size++] = v;
}
  1. 栈的删除也叫弹栈或者出栈
void StackPop(Stack* s,int v) {s->size--;
}

3.获取栈顶元素

/返回栈顶的数据,不需要删除栈顶的数据int StsckTop(Stack* s) {return s->array[s->size - 1];
}

4.获取栈内元素个数

//返回栈内数据个数int StackSize(Stack* s) {return s->size;
}

5.检查栈是否为空栈;(返回0表示空栈)

//返回栈内是否为空栈
//返回0:代表不是空;返回非0:表示为空int StackEmpty(Stack* s) {return !s->size;
}

队列

  • 队列:只允许在一端进行插入数据操作操作 ,在另一端进行删除数据操作的特殊线性表;进行插入数据的一端叫队尾,进行删除一端叫队头;
  • 特性:先进先出,后进后出
  • 队的实现:队列也可以用数组或者链表实现;使用链表的结构实现会更优一些;因为使用数组结构在出队列是在数组的头上出数据,效率会更低;

队列的构造(用链表实现)

//链表节点的结构体
typedef struct Node {int value;struct Node* next;
} Node;//队列的构造
typedef struct Queue {Node* head;  //队头Node* last;  //队尾
} Queue;

队列的初始化与销毁

//初始化
void QueueInit(Queue* q) {q->head = q->last = NULL;
}//队列的销毁
void QueueDestroy(Queue* q) {Node *cur, *next;for (cur = q->head; cur != NULL; cur = next) {next = cur->next;free(cur);}q->head = q->last = NULL;
}

队列的入队、出对、获取队列首元素、获取队列大小、判断队列是否为空

  • 队列的入队(尾插)
void QueuePush(Queue* q,int v){ Node* node= (Node*)malloc(sizeof(Node));node->value = v;node->next = NULL;if (q->head == NULL) {q->head = node;q->last = node;}else {q->last->next = node;q->last = node;}
}
  • 删除队列的头一个数据(头删)
void QueuePop(Queue* q) {Node* second = q->head->next;free(q->head);q->head = second;//last也有可能需要变更if (q->head == NULL) {q->head == NULL;}
}
  • 获取队列的首元素
//返回队列首元素int QueueFront(Queue* q) {return q->head->value;
}
  • 获取队列的大小
int  QueueSize(Queue* q) {int size = 0;for (Node* cur = q->head; cur != NULL; cur = cur->next) {size++;}return size;
}
  • 判断队列是否为空
//判断队列是否为空
int QueueEmpty(Queue* q) {if (q->head == NULL) {return -1;}else {return 0;}
}

栈和队列的插入、删除等基本操作相关推荐

  1. 栈和队列的插入、删除、获取头尾元素操作

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作.进行数据插入和删除操作的一端称为栈顶,另一端称为栈底.栈又称为后进先出的线性表. Stack.h #pragma once#inclu ...

  2. 【Leetcode栈与队列】1047.删除字符串中的所有相邻重复项 6120.数组能形成多少数对(一些题外话和做题经验!!看作对对碰游戏!!)

    文章目录 题外话 1.游戏开发可能使用栈结构 2.编程语言的一些功能实现也会使用栈结构 Leetcode 1047.删除字符串中的所有相邻重复项 1.问题描述 2.解决方案 Leetcode 6120 ...

  3. 栈和队列以及线性表的区别

    1.队列先进先出,栈先进后出. 2.对插入和删除操作的"限定". 栈是限定只能在表的一端进行插入和删除操作的线性表.队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表. ...

  4. 《大话数据结构》3、4、5线性表、栈与队列、串

    第3章线性表 41 线性表:零个或多个数据元素的有限序列. 3.1开场白 42 门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比.哎,有时大人的所作所为,其实还不如孩子. 3.2线性表的定 ...

  5. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  6. 六十二、数据结构栈和队列的相互实现

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 算法,一门既不容易入门,也不容易精通的学问. 栈和队列都是用来保存数 ...

  7. 栈和队列详解(C语言)

    栈和队列 栈 队列 力扣笔试题 栈 栈是什么,栈是一种数据存储的结构,采用的是先进后出,后进先出的原则,就好像是弹匣里的子弹,比如说一个弹匣有30发容量,那第一个发压进去的子弹肯定是最后一个射出的,最 ...

  8. 数据结构之—栈和队列

    目录 引言 一.栈(stack) 1.栈的应用 2.栈的实现 二.队列 1.基础队列的实现 2.循环队列 ​编辑 1)概念 2)如何判断环形队列为空⭐ 总结:环形队列是否已满条件:(tail+1)%d ...

  9. 队列的基本操作_如果让你手写个栈和队列,你还会写吗?||CSDN博客精选

    来源:华为云云享专家倪升武 昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合. 确实,经典的数据结构,包括排序算法,虽 ...

最新文章

  1. 《大话数据结构》第9章 排序 9.8 归并排序(上)
  2. gridview 在已有数据的基础上添加数据_基于Python的数据分析-1.语法基础(上)
  3. Qt工作笔记-QCustomplot绘制表,实现输入定位功能
  4. 滑雪(洛谷-P1434)
  5. RocketMQ入门到入土(五)消息持久化存储源码解析
  6. 生活质量衡量系统_16个你需要了解的DevOps指标,助你提升软件质量
  7. html5实例-闪烁的星星
  8. 汇编语言将正负数复制到不同的数组
  9. 设计模式之GOF23代理模式03
  10. 题目242-计算球体积
  11. Python(二十):迭代器、生成器
  12. vs2015社区版有账号后仍然过期
  13. EOS价格震荡起伏,EOS生态数据不断上行
  14. java黄金分割点游戏_结对编程--黄金分割点游戏
  15. form表单label加问号图标以及提示词
  16. 考研英语近义词与反义词·三
  17. CVPR2020 Rotate-and-Render: Unsupervised Photorealistic Face Rotation from Single-View Images论文笔记
  18. FastQC 与 质控
  19. 0910---scipy.signal.argrelextrema 计算多维数组局部极值问题
  20. 前端案例-30 Vue常用特性案例汇总

热门文章

  1. 【MVC架构】MVC控制器
  2. Java实现短信通知验证
  3. (15.1.14)Google正式发布Android L系统 剖析安卓5.0安卓L新特性
  4. C#SendMessage用法
  5. 光学基础概念系列之——景深、工作距离、物像
  6. 人脸识别(基于阿里云)
  7. android 微信浮窗实现_Android仿微信视屏悬浮窗效果
  8. 《Unix/Linux日志分析与流量监控》书稿完成
  9. 怎么用好系统重装助手装机?
  10. 致3位阿里小伙伴的情书