特点

栈——先进后出

队列——后进先出

思路

1. 快速得到最大值的栈

结构

  1. 需要两个数组:一个数组stackItem保存栈的元素,另一个数组link2NextMaxValueIndex保存下一个最大值的位置
  2. 两个指针:一个为stackTop指向栈顶,另一个为maxValueIndex指向最大值的下标

操作

  1. 插入时:比较插入元素与最大值的大小,如果比最大值还大呢,link2NextMaxValueIndex指向原来最大值的位置(即maxValueIndex),而maxValueIndex变为现在插入元素的位置;否则link2NextMaxValueIndex指向-1
  2. 删除时:删除元素的位置出,如果maxValueIndex与当前位置相同,此时maxValueIndex为link2NextMaxValueIndex[satckTop]
  3. 返回栈的最大元素

图示

以入栈2 7 1,出栈为例:

代码

#include <iostream>
#include <climits>
#define MAX 100
using namespace std;class stack
{public:stack() : stackTop(-1), maxValueIndex(-1) {}    void push(int val);int pop();int max();int size() { return stackTop + 1; }int empty() { return stackTop < 0 ? 1 : 0; }private:int stackItem[MAX];int link2NextMaxValueIndex[MAX];int stackTop;int maxValueIndex;
};void stack::push(int val)
{++stackTop;if(stackTop == MAX){cout << "The stack has been full!" << endl;return;}else{stackItem[stackTop] = val;if(max() < val){link2NextMaxValueIndex[stackTop] = maxValueIndex;maxValueIndex = stackTop;}elselink2NextMaxValueIndex[stackTop] = -1;}
}
int stack::pop()
{int ret; if(stackTop == -1){cout << "The stack is empty!" << endl;return -1;}else{ret = stackItem[stackTop];if(stackTop == maxValueIndex)maxValueIndex = link2NextMaxValueIndex[stackTop];--stackTop;return ret;}
}
int stack::max()
{if(maxValueIndex >= 0)return stackItem[maxValueIndex];elsereturn INT_MIN;
}int main()
{stack s;cout << "s.empty():" << s.empty() << endl;s.push(3);s.push(4);cout << "s.top():" << s.pop() << endl;cout << "s.top():" << s.pop() << endl;cout << "s.top():" << s.pop() << endl;cout << "s.size():" << s.size() << endl;cout << "s.empty():" << s.empty() << endl;
}

结果

2. 快速得到最大值的队列

两个栈可以实现队列(参考),就用刚才的栈实现队列

代码

#include <iostream>
#include <climits>
#define MAX 100
using namespace std;class stack
{public:stack() : stackTop(-1), maxValueIndex(-1) {}    void push(int val);int pop();int max();int size() { return stackTop + 1; }int empty() { return stackTop < 0 ? 1 : 0; }private:int stackItem[MAX];int link2NextMaxValueIndex[MAX];int stackTop;int maxValueIndex;
};
class queue
{public:void enQueue(int val);int deQueue();int size() { return stackIn.size() + stackOut.size(); }private:stack stackIn;stack stackOut;
};void stack::push(int val)
{++stackTop;if(stackTop == MAX){cout << "The stack has been full!" << endl;return;}else{stackItem[stackTop] = val;if(max() < val){link2NextMaxValueIndex[stackTop] = maxValueIndex;maxValueIndex = stackTop;}elselink2NextMaxValueIndex[stackTop] = -1;}
}
int stack::pop()
{int ret; if(stackTop == -1){cout << "The stack is empty!" << endl;return -1;}else{ret = stackItem[stackTop];if(stackTop == maxValueIndex)maxValueIndex = link2NextMaxValueIndex[stackTop];--stackTop;return ret;}
}
int stack::max()
{if(maxValueIndex >= 0)return stackItem[maxValueIndex];elsereturn -100;
}void queue::enQueue(int val)
{stackIn.push(val);
}int queue::deQueue()
{if(stackOut.empty() and !stackIn.empty()){while(!stackIn.empty())stackOut.push(stackIn.pop());}return stackOut.pop();
}int main()
{stack s;cout << "s.empty():" << s.empty() << endl;s.push(3);s.push(4);cout << "s.top():" << s.pop() << endl;cout << "s.top():" << s.pop() << endl;cout << "s.top():" << s.pop() << endl;cout << "s.size():" << s.size() << endl;cout << "s.empty():" << s.empty() << endl;queue q;q.enQueue(1);q.enQueue(2);q.enQueue(3);cout << "q.size()" << q.size() << endl;q.deQueue();cout << "q.size()" << q.size() << endl;
}

结果

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3529942.html,如需转载请自行联系原作者

快速得到栈、队列的最大值相关推荐

  1. 剑指Offer - 面试题59 - II. 队列的最大值(deque模拟单调栈)

    1. 题目 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的时间复杂度都是O(1). 若队列为空,pop_f ...

  2. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  3. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  4. 编程之美3.7 队列中最大值问题

          这道题目的意思是,有一个队列,它里面会存储一些数值,现在,要求你需要在 O(1) 的时间内返回这个队列中最大的那个值.       这道题目的和栈中最大值最小值问题是一样的解法,都是需要一 ...

  5. 面试题59 - II. 队列的最大值

    2020-05-15 1.题目描述 队列的最大值 2.题解 这个题目有点像滑动窗口求最大值以及栈的最大值的结合体,我们可以模仿滑动窗口求最大值,开辟一个 双端队列来求解最大值. 3.代码 class ...

  6. python 优先队列_python实现最大优先队列 python优先级队列如何最大值优先

    python优先级队列如何最大值优先 啥???????队列默认就有优先级即使告别爱情的时候,也希望你一切都好;小编不再爱你的时候,也许不是小编不爱你,只是,小编已不能再爱你. python3 优先队列 ...

  7. 《JavaScript快速全栈开发》作者Azat Mardanov:现在是拥抱Node技术栈的最佳时机

    非商业转载请注明作译者.出处,并保留本文的原始链接:http://www.ituring.com.cn/article/195742 Azat Mardanov是一位有着12年开发经验的资深软件工程师 ...

  8. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  9. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  10. java 栈 队列 接口_Java队列接口

    java 栈 队列 接口 介绍: 队列是FIFO(先进先出)抽象数据类型(ADT). 换句话说,按插入顺序将元素删除. java.util.Queue是Java 中的接口,并且从java.util.C ...

最新文章

  1. C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
  2. android自定义图标下载,charts
  3. LeetCode139:Word Break
  4. JMETER 分布式踩过的坑及填坑方法
  5. Win-MASM64汇编语言-CALL/RET/RETF指令
  6. 算法之路(5)--括号匹配问题(Valid Parentheses)[leetcode]
  7. linux 实现远程桌面 VNC
  8. 每一个都能笑抽的39个奇葩代码注释
  9. 【制作脑图】万彩脑图大师教程 | 概括主题
  10. 房产过户给子女,那种方式比较合适
  11. 服务器硬盘用在硬盘录像机,网络硬盘录像机是干什么用的
  12. 手机浏览器找不到服务器,苹果手机的Safari浏览器找不到服务器怎么办?
  13. 电脑重装系统按哪个键进入u盘启动项
  14. redis主从+哨兵
  15. Java基础之IO流(持续更新中)
  16. Linux下tree命令的安装与使用
  17. 20国外国人被惊呆!直呼这些东西是中国新四大发明!
  18. 你想过吗,为什么说面向对象最符合人的思维?
  19. 全国计算机二级aoa真题题库,计算机AOA试题单选判断及答案.docx
  20. ubuntu bash: /dev/fd/63: No such file or directory

热门文章

  1. 5界面怎么做窗帘拉动的效果_布艺窗帘款式有哪些?附2020年最新窗帘款式图!...
  2. fun python_Python(一)
  3. 【AI-1000问】Face detection、alignment、verification、identification(recognization) 你能分的清楚吗?
  4. 全球及中国模块化塑料带行业供需调查及产销形势预测报告2021-2027年版
  5. 中国反渗透膜产业竞争现状与投资战略决策报告2021-2027年版
  6. python 查看帮助
  7. php websocket 心跳包,websocket 心跳包重连
  8. python从命令行获取参数_python从命令行获取参数操作
  9. 花生增产万书波谋定中国农民丰收节交易会 山东科技最高奖
  10. Factory Method工厂方法模式