栈和队列

目录

    • 顺序栈
      • 顺序栈定义
      • 顺序栈初始化
      • 入栈
      • 出栈
      • 读栈顶元素
      • 判断栈是否为空
    • 共享栈
      • 定义
      • 初始化
      • 入栈
      • 出栈
    • 链栈
  • 队列
    • 顺序队列
      • 定义
      • 初始化
      • 入队
      • 出队
      • 获取队头元素
      • 判断队列是否为空
    • 队列链式存储
      • 定义
      • 初始化
      • 入队
      • 出队
      • 判断队列是否为空
    • 队列链式存储(不带头结点)
      • 定义
      • 初始化
      • 入队
      • 出队
      • 判断队列是否为空

  • 定义:是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作

顺序栈

顺序栈定义
  • 采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置
#define MaxSize 10
typedef struct {int data[MaxSize];int top;
}SqStack;
顺序栈初始化
//初始化
void InitStack(SqStack& S) {S.top = -1;  //data[0]还没有放数据元素
}
入栈
//入栈
bool Push(SqStack& S, int x) {if (S.top == MaxSize - 1)return false;S.top = S.top + 1;//初始指向data[-1]S.data[S.top] = x;//等价于//S.data[++S.top] = x;return true;
}
出栈
//出栈
bool Pop(SqStack& S, int& x) {if (S.top == -1)return false;x = S.data[S.top];S.top = S.top - 1;//等价于//x = S.data[S.top--];return true;
}
读栈顶元素
//读栈顶元素
bool GetTop(SqStack S, int& x) {if (S.top == -1)return false;x = S.data[S.top];return true;
}
判断栈是否为空
//判断栈是否为空
bool StackEmpty(SqStack S) {if (S.top == -1) //栈空return true;elsereturn false;
}

共享栈

定义
  • 利用栈底位置相对不变的特征,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
#define MaxSize 10typedef struct {int data[MaxSize];int top0;int top1;
}ShStack;ShStack s; //全局变量
初始化
//初始化栈
void InitStack(ShStack& s) {s.top1 = MaxSize;  //上s.top0 = -1;//下
}
入栈
//入栈
int push(int i, int x) {if (i < 0 || i>1) {cout << "栈号输入不对" << endl;exit(0);}if (s.top1 - s.top0 == 1) {cout << "栈满了" << endl;return 0;}switch (i){case 0:s.data[++s.top0] = x;break;case 1:s.data[--s.top1] = x;break;}
}
出栈
//出栈
int pop(int i) {if (i < 0 || i>1) {cout << "栈号输入错误" << endl;exit(0);}switch (i) {case 0:if (s.top0 == -1) {cout << "栈空" << endl;}else {//return s.data[s.top0--];cout << s.data[s.top0--] << endl;}break;case 1:if (s.top1 == MaxSize) {cout << "栈空" << endl;}else {//return s.data[s.top1++];cout << s.data[s.top1++] << endl;}break;}
}

链栈

  • 采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。

类似单链表的头插法

队列

顺序队列

定义
  • 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针 front指向队头元素,队尾指针 rear 指向队尾元素的下一个位置
#define MaxSize 10
typedef struct {int data[MaxSize];int front, rear; //队头和队尾指针
}SqQueue;
初始化
//初始化
void InitQueue(SqQueue& Q) {Q.rear = Q.front = 0;
}
入队
//入队
bool EnQueue(SqQueue& Q, int x) {if ((Q.rear + 1) % MaxSize == Q.front) //牺牲一个节点空间return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;return true;
}
出队
//出队
bool DeQueue(SqQueue& Q, int& x) {if (Q.rear == Q.front) //判断队空return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;return true;
}
获取队头元素
//获取队头元素
bool GetHead(SqQueue Q, int& x) {if (Q.rear == Q.front)return false;x = Q.data[Q.front];return true;
}
判断队列是否为空
//判断队列是否为空
bool QueueEmpty(SqQueue Q) {if (Q.rear == Q.front) //对空条件return true;elsereturn false;
}

队列链式存储

定义
  • 队列的链式存储结构表示为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,只不过它只能尾进头出而已
typedef struct LinkNode {int data;struct LinkNode* next;
}LinkNode;typedef struct {LinkNode* front, * rear; //队头和队尾指针
}LinkQueue;
初始化
//初始化
void InitQueue(LinkQueue& Q) {Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));Q.front->next = NULL;
}
入队
//入队
void EnQueue(LinkQueue& Q, int x) {LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = x;s->next = NULL;Q.rear->next = s;Q.rear = s;
}
出队
//出队
bool DeQueue(LinkQueue& Q, int& x) {if (Q.front == Q.rear)return false;  //空队LinkNode* p = Q.front->next;x = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front;free(p);return true;
}
判断队列是否为空
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {if (Q.front == Q.rear)return true;elsereturn false;
}

队列链式存储(不带头结点)

定义
typedef struct LinkNode {int data;struct LinkNode* next;
}LinkNode;typedef struct {LinkNode* front, * rear; //队头和队尾指针
}LinkQueue;
初始化
//初始化
void InitQueue(LinkQueue& Q) {Q.front = NULL;Q.rear = NULL;
}
入队
//入队(不带头结点)
void EnQueue(LinkQueue& Q, int x) {LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = x;s->next = NULL;if (Q.front == NULL) {Q.front = s;Q.rear = s;} else {Q.rear->next = s;Q.rear = s;}
}
出队
//出队(不带头结点)
bool DeQueue(LinkQueue& Q, int& x) {if (Q.front == NULL)return false;LinkNode* p = Q.front;x = p->data;Q.front = p->next;if (Q.rear == p) { //此次是最后一个节点出队Q.front = NULL;Q.rear = NULL;}free(p);return true;
}
判断队列是否为空
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {if (Q.rear == NULL)return true;elsereturn false;
}

此博文的分享就到此啦,点个关注再走吧
✨你好啊,我是“ 满级小白”,是一名在校大学生。

我爷爷都看的懂的《栈和队列》,学不会来打我相关推荐

  1. 爆肝两万字,我爷爷都看的懂的《栈和队列》,建议各位观众姥爷先收藏

    文章目录 一.栈

  2. 【机器学习】小孩都看得懂的 GAN

    全文共 6327 字,55 幅图, 预计阅读时间 32 分钟. 本文是「小孩都看得懂」系列的第十八篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少.喜欢就好! 小孩都看得懂的 ...

  3. 循环神经网络_小孩都看得懂的循环神经网络

    点击上方"MLNLP",选择"星标"公众号 重磅干货,第一时间送达 全文共 2014 字,28 幅图,预计阅读时间 20 分钟. 本文是「小孩都看得懂」系列的第 ...

  4. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  5. 一本书读懂大数据(每个人都看得懂的大数据入门书) - 电子书下载(高清版PDF格式+EPUB格式)...

    一本书读懂大数据(每个人都看得懂的大数据入门书)-黄颖 在线阅读                   百度网盘下载(635f) 书名:一本书读懂大数据(每个人都看得懂的大数据入门书) 作者:黄颖 格式 ...

  6. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

  7. 计算机网络之交换机的工作原理---超详细解析,谁都看得懂!!

    在了解交换机的工作原理之前,我们先要了解几个概念. 一.相关概念  1.OSI七层模型是哪七层? 自上而下分别是: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 交换机工作在数据链路层, ...

  8. 小孩都看得懂的贝塔分布

    全文共 1897 字,22 幅图, 预计阅读时间 10 分钟. 本文是「小孩都看得懂」系列的第十五篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少.喜欢就好! 小孩都看得懂的 ...

  9. 小孩都看得懂的假设检验

    全文共 2915 字,10 幅图, 预计阅读时间 8 分钟. 本文是「小孩都看得懂」系列的第十篇,本系列的特点是极少公式,没有代码,只有图画,只有故事.内容不长,碎片时间完全可以看完,但我背后付出的心 ...

最新文章

  1. xftp permission is not allowed
  2. [Python]再学 socket 之非阻塞 Server
  3. jupyter kernel_jupyter增加多版本python内核
  4. leetcode 218. 天际线问题
  5. 鸿蒙渊之后是什么任务,都说这次主线好,那我来唱唱反调吧
  6. neo4j python_Python 操作 Neo4j 数据库!
  7. PHP7实战开发简单CMS内容管理系统(11)批量删除栏目数据
  8. linux防火墙之牛刀小试
  9. 汽车辐射监测系统-Qt开发
  10. Go语言的指针的一些测试
  11. php显示jquery未定义,运行PHP脚本时,jQuery函数表示未定义
  12. 现博客已搬至简书(https://www.jianshu.com/u/6639243cadf1)
  13. 批量处理文件内容数据
  14. Python 转义字符表
  15. 数据库应用之(教育)
  16. android achartengine 背景,Android图标库AChartEngine使用(一)曲线图
  17. 微信h5小游戏作品欣赏:详解微信h5如何制作
  18. win10配置lua环境
  19. Android 性能优化五大误区和两大疑点!
  20. Hadoop Yarn ResourceManager启动失败

热门文章

  1. 关于和||的优先级问题
  2. HTML5七夕情人节表白网页(雪花爱心表白) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱心表白
  3. uniApp学习(8)搜索框的创建和自动获取焦点
  4. 文献翻译:Social LSTM: Human Trajectory Prediction in Crowded Spaces
  5. asp毕业设计——基于asp+access的电子政务档案管理系统设计与实现(毕业论文+程序源码)——电子政务档案管理系统
  6. es6相关面试题:1.rest参数;2.new.target;3.object.defineProperty与Proxy的区别;4.Reflect对象作用;5.lterator迭代器;6.async
  7. ubuntu训练深度学习模型电脑重启解决方法
  8. 无监督-主题模型(TM)/隐语义模型(LFM)(四):LDA(隐狄利克雷分布)【 数据(似然)(多项分布)+先验分布(狄雷分布)-> 后验分布(狄雷分布),后验分布作为下一轮的先验分布】【广泛使用】
  9. Xilinx FFT IP使用总结
  10. 50件事爸爸一定要与孩子做(转)