队列部分

普通队列

  举个形象的例子:排队买票。

  有一列人在排队买票,前面来的人买完票就离开,后面来的人需要站在最后……依次类推。

 在计算机中,数据结构队列有一个头指针和尾指针,头指针加一就代表有一个数据出队了(人买完票),尾指针加一就代表有一共数据入队了。

  队列,是一种线性表结构。它的主体是一个数组,第一个队内元素所在的位置叫做队首,而最后一个元素所在的位置叫做队尾。队列允许在队首队尾进行操作。因此,队列具有一个特殊而重要的性质FIFO(先进先出)。

  普通队列大概是这个样子的:

普通队列实现

手写实现:

  1. #include <iostream>
  2. using namespace std;
  3. struct queue//将队列封装在一个结构体中
  4. {
  5. int head=0,tail=0;//head代表头指针,tail代表尾指针
  6. int a[100];//队列元素存储于此
  7. void pop(){head++;}//弹出队头元素
  8. void push(int num){a[tail]=num;tail++;}//在队尾插入元素
  9. int size(){return tail-head;}//判断队列元素个数
  10. int back(){return a[tail-1];}//返回队尾元素
  11. int front(){return a[head];}//返回队头元素
  12. bool empty(){if(head==tail)return true;return false;}//判断队列是否为空
  13. };
  14. int main()
  15. {
  16. //测试手写队列
  17. queue q;
  18. q.push(1);
  19. cout<<q.front()<<endl;
  20. q.pop();
  21. if(q.empty())q.push(2);
  22. cout<<q.front()<<endl;
  23. q.push(3);
  24. cout<<q.back()<<endl;
  25. cout<<q.size();
  26. return 0;
  27. }

STL实现:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <queue>
  4. using namespace std;
  5. int main()
  6. {
  7. queue<int>q;
  8. q.pop();//弹出队头元素
  9. q.push(1);//将1这个元素插入队尾
  10. q.size();//判断队列元素个数
  11. q.front();//返回队头元素
  12. q.back();//返回队尾元素
  13. q.empty();//判断队列是否为空
  14. return 0;
  15. }

单调队列

  顾名思义,单调队列可以保证队内元素时刻保持单调(单调递增、单调递减、单调非减、单调非增)。

  单调队列虽然叫“队列”,但其实和队列有很大差别:为了保证队内元素单调,会强行舍弃队中的一些元素。这点与FIFO的队列有很大不同,所以应该把单调队列看作是原数列的一个单调子序列。

  另外,与普通队列不同的是,单调队列可以在队头和队尾插入和删除元素。

优先队列

  顾名思义,优先队列就是指队列中的每一个元素都有一个优先级,优先级可以是最大的元素优先级最大,也可以是最小的元素优先级最大,具体看优先队列的定义。

  优先队列,其实在本质上与堆没有多大的区别。

优先队列实现

手写实现:

  1. #include <iostream>
  2. #define cmp(a,b) (a>b)//如果要修改元素优先级,在这里修改
  3. #define sort(h,t) for(int i=t-1;cmp(a[i],a[i-1])&&i>=h;i--)swap(a[i],a[i-1])
  4. using namespace std;
  5. struct priority_queue//默认最大的元素优先级最大的优先队列
  6. {
  7. int head=0,tail=0;//head代表头指针,tail代表尾指针
  8. int a[100];//队列元素存储于此
  9. void pop(){head++;}//弹出队头元素
  10. void push(int num){a[tail]=num;tail++;sort(head,tail);}//在队尾插入元素,改变元素优先级
  11. int size(){return tail-head;}//判断队列元素个数
  12. int top(){return a[head];}//返回队头(优先级最高)的元素
  13. bool empty(){if(head==tail)return true;return false;}//判断队列是否为空
  14. };
  15. int main()
  16. {
  17. //测试
  18. priority_queue q;
  19. q.push(1);q.push(2);q.push(3);
  20. cout<<q.size()<<endl;
  21. cout<<q.top()<<endl;
  22. q.pop();
  23. cout<<q.top()<<endl;
  24. q.pop();
  25. cout<<q.top()<<endl;
  26. q.pop();
  27. if(q.empty())q.push(1);
  28. cout<<q.top();
  29. return 0;
  30. }

STL实现:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main()
  5. {
  6. priority_queue<int>q;
  7. q.pop();//弹出队头元素
  8. q.push(1);//将1这个元素插入队尾
  9. q.size();//判断队列元素个数
  10. q.top();//返回队头(优先级最高)的元素
  11. q.empty();//判断队列是否为空
  12. return 0;
  13. }

栈部分

  栈,是一种数据结构,它具有先进后出(FILO)的特性,意思是,第一个进入的元素,是最后出来的,这与队列完全是相反的。

  举个形象的例子:从羽毛球筒里拿羽毛球。

  有一个羽毛球筒,只有一个开口,里面放满了羽毛球,这时,你想拿最底下的羽毛球,你会怎么做呢?

  答案是:把前面所有的羽毛球都拿出来,最后拿最底下的。

  这就运用了栈的思想,栈最主要的特点就是先进后出(FILO)。

  栈大概长这样:

栈实现

手写实现:

  1. #include <iostream>
  2. using namespace std;
  3. struct stack//将栈封装在一个结构体当中
  4. {
  5. int a[100];//栈元素存在此中
  6. int Top=0;//栈顶
  7. void pop(){Top--;};//弹出栈顶元素
  8. void push(int num){a[Top]=num;Top++;}//将元素插入栈顶
  9. int top(){return a[Top];}//返回栈顶元素
  10. int size(){return Top;}//判断栈元素个数
  11. bool empty(){if(!Top)return true;return false;}//判断栈是否为空
  12. };
  13. int main()
  14. {
  15. //测试
  16. stack s;
  17. s.push(1);
  18. cout<<s.top()<<endl<<s.size()<<endl;
  19. s.pop();
  20. if(s.empty())s.push(2);
  21. cout<<s.top();
  22. return 0;
  23. }

STL实现:

  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. int main()
  5. {
  6. stack<int>s;
  7. s.pop();//弹出栈顶元素
  8. s.push(1);//将1这个元素插入栈顶
  9. s.top();//返回栈顶元素
  10. s.size();//判断栈元素个数
  11. s.empty();//判断栈是否为空
  12. return 0;
  13. }

栈&队列的更多相关文章

  1. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  2. Java 容器之 Connection栈队列及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  3. java面向对象的栈 队列 优先级队列的比较

    栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...

  4. C++实现一个简单的双栈队列

    双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出 此结构类似汉诺塔, 非常经典, 这里 ...

  5. 栈&队列&并查集&哈希表(julyedu网课整理)

    date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...

  6. Leetcode栈&队列

    Leetcode栈&队列 232.用栈实现队列 题干: 思路: 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性. 具体实现方法可以理解为,准备两个栈, ...

  7. 【图解数据结构】 栈&队列

    [TOC] 勤于总结,持续输出! 1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包 ...

  8. 数据结构 栈&队列

    2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...

  9. day22 栈 , 队列 , 约束和反射

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.请使用面向对象实现栈(后进先出)"""class Account: def ...

随机推荐

  1. Android ION内存分配

    The Android ION memory allocator 英文原文 ION heaps ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display c ...

  2. Elasticsearch源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...

  3. vue(2)—— vue简单语法运用,常用指令集

    按照前面的文章:vue(1)——node.js安装使用,利用npm安装vue  安装完vue之后,就可以使用vue了 vue vue简介 前面安装好vue之后,确实还没有对vue进行介绍,首先,官网: ...

  4. redhat yum ISO 本地源

    先将ISO文件挂载起来: [root@racdb1 ~]# mount -o loop /opt/soft/rhel-server-6.8-x86_64-dvd.iso /mnt/iso [root@ ...

  5. 注册表修改computer name

    修改windows server的机器名的时候,发现change按钮是disable的. 手动修改不了,用注册表regedit来修改. HKEY_LOCAL_MACHINE\SYSTEM\Curren ...

  6. CentOS7编译安装php7.1

    1.首先安装依赖包: yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl ...

  7. shell中的EOF用法

    重定位运算符 >> 是追加内容> 是覆盖原有内容 1.EOF Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止 ...

  8. python中的struct模块的学习

    由于TCP协议中的黏包现象的发生,对于最low的办法,每次发送之前让他睡一秒,然后在发送,可是这样真的太low了,而且太占用资源了. 黏包现象只发生在tcp协议中: 1.从表面上看,黏包问题主要是因为 ...

  9. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  10. git 命令积累

    git status # 查看仓库的状态 git add . # 监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的 ...