文章目录

  • 1.预备知识
    • 1.1 栈
    • 1.2 队列
    • 1.3 堆
  • 2.用队列实现栈
    • 2.1 题目描述
    • 2.2 解题思路
    • 2.3 C++实现
  • 3.用栈实现队列
    • 3.1 题目描述
    • 3.2 解题思路
    • 3.3 C++实现
  • 4.最小栈
    • 4.1 题目描述
    • 4.2 解题思路
  • 5.合法的出栈序列
    • 5.1 题目描述
    • 5.2 解题思路
    • 5.3 C++实现
  • 6.基本计算器
    • 6.1 题目描述
    • 6.2 解题思路
  • 7.数组中的第K个最大元素
    • 7.1 题目描述
    • 7.2 解题思路
    • 7.3 C++实现
  • 8.数据流的中位数
    • 8.1 题目描述
    • 8.2 解题思路
    • 8.3 C++实现

1.预备知识

1.1 栈

S.empty() //1
S.push(10); //2
S.pop(); //3
1.2 队列

Q.push(5); //1
Q.pop(); //2
Q.push(1); //3
1.3 堆

图:堆
图:堆的函数

big_heap.push(1000); //1
i<3 // 2
big_heap.pop(); //3

2.用队列实现栈

2.1 题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)

实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

2.2 解题思路

2.3 C++实现
class MyStack {public:/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {queue<int> temp_queue;temp_queue.push(x);while(!_data.empty()){temp_queue.push(_data.front());_data.pop();}while(!temp_queue.empty()){_data.push(temp_queue.front());temp_queue.pop();}}/** Removes the element on top of the stack and returns that element. */int pop() {int x=_data.front();_data.pop();return x;}/** Get the top element. */int top() {return _data.front();}/** Returns whether the stack is empty. */bool empty() {return _data.empty();}
private:queue<int> _data;
};

3.用栈实现队列

3.1 题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

3.2 解题思路

3.3 C++实现
class MyQueue {public:/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stack<int> temp_stack;while(!_data.empty()){temp_stack.push(_data.top());_data.pop();}temp_stack.push(x);while(!temp_stack.empty()){_data.push(temp_stack.top());temp_stack.pop();}}/** Removes the element from in front of queue and returns that element. */int pop() {int x=_data.top();_data.pop();return x;}/** Get the front element. */int peek() {return _data.top();}/** Returns whether the queue is empty. */bool empty() {return _data.empty();}
private:stack<int> _data;
};

4.最小栈

4.1 题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
4.2 解题思路
class MinStack {public:/** initialize your data structure here. */MinStack() {}void push(int val) {_data.push(val);if(_min.empty()){_min.push(val);}else{if(val>_min.top()){val=_min.top();}_min.push(val);}}void pop() {_data.pop();_min.pop();}int top() {return _data.top();}int getMin() {return _min.top();}
private:stack<int> _data;stack<int> _min;
};

5.合法的出栈序列

5.1 题目描述

5.2 解题思路

图1:模拟入栈出栈
图2:步骤1

图3:步骤2

图4:步骤3
图5:步骤4

5.3 C++实现
#include <iostream>
#include<queue>
#include<stack>
using namespace std;bool check_is_valid_order(queue<int>& order)
{stack<int> S;int n = order.size();for (int i = 1; i <= n; i++) {S.push(i);while (!S.empty() && S.top() == order.front()) {S.pop();order.pop();}}if (!S.empty()) {return false;}return true;
}int main()
{//合法:32541 ;非法:31245queue<int> order1, order2;bool a1, a2;order1.push(3);order1.push(2);order1.push(5);order1.push(4);order1.push(1);a1 = check_is_valid_order(order1);if (a1 == true) {cout << "32541合法" << endl;}else {cout << "32541非法" << endl;}order2.push(3);order2.push(1);order2.push(2);order2.push(4);order2.push(5);a2 = check_is_valid_order(order2);if (a2 == true) {cout << "31245合法" << endl;}else {cout << "31245非法" << endl;}return 0;
}

6.基本计算器

6.1 题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
6.2 解题思路

图1:栈内元素计算

图2:使用栈处理优先级

图3:将字符串转化为数字

图4:计算函数

图5:字符串处理思路

7.数组中的第K个最大元素

7.1 题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

7.2 解题思路

图1:思路
图2:思路

7.3 C++实现
class Solution {public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int,vector<int>,greater<int>> Q;for(int i=0;i<nums.size();i++){if(Q.size()<k){Q.push(nums[i]);}else if(Q.top()<nums[i]){Q.pop();Q.push(nums[i]);}}return Q.top();}
};

8.数据流的中位数

8.1 题目描述

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。

8.2 解题思路


8.3 C++实现
class MedianFinder {public:/** initialize your data structure here. */MedianFinder() {}void addNum(int num) {if(big_queue.empty()){big_queue.push(num);return;}if(big_queue.size()==small_queue.size()){if(num<big_queue.top()){big_queue.push(num);}else{small_queue.push(num);}}else if(big_queue.size()>small_queue.size()){if(num>big_queue.top()){small_queue.push(num);}else{small_queue.push(big_queue.top());big_queue.pop();big_queue.push(num);}}else if(small_queue.size()>big_queue.size()){if(num<small_queue.top()){big_queue.push(num);}else{big_queue.push(small_queue.top());small_queue.pop();small_queue.push(num);}}}double findMedian() {if(small_queue.size()==big_queue.size()){return (small_queue.top()+big_queue.top())/2;}else if(small_queue.size()>big_queue.size()){return small_queue.top();}return big_queue.top();}
private:priority_queue<double,vector<double>,greater<double>> small_queue;priority_queue<double,vector<double>,less<double>> big_queue;
};

数据结构和算法——栈、队列、堆相关推荐

  1. 数据结构与算法-栈与队列

    数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...

  2. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  3. 数据结构与算法_03队列

    数据结构与算法_03队列 队列 0.章节重点整理 1.认识队列 1.1. 队列的工作运算 1.2.队列的数组实现 1.3.队列的链表实现 2.队列的应用 2.1.环形队列 2.2.双向队列 队列 0. ...

  4. 数据结构与算法:队列——02

    文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...

  5. 数据结构与算法——二叉树、堆、优先队列

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 七 ...

  6. abcde依次进入一个队列_数据结构与算法(6):队列

    (文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...

  7. 数据结构与算法之-----队列(Queue)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...

  8. 1. 数据结构与算法——栈

    数据结构与算法 数据结构是计算机中存储.组织数据的方式 算法通俗理解就是解决问题的方法/步骤逻辑 定义:1.一个有限的指令集,每条指令的描述不依赖与语言2.接受一些输入(也可能不需要输入),产生输出3 ...

  9. 数据结构与算法 -- 栈 ADT

    这两天翻了下数据结构与算法分析.严蔚敏的数据结构.C和指针.C Primer Plus这些本书,受益很多.不过大多的示例不够完整,需要自己动手编写程序.又看了遍培训时的笔记,虽然很糙但是精华的部分还是 ...

  10. 数据结构与算法 / 栈(stack)

    @time 2019-07-24 @author Ruo_Xiao @reference 极客时间 -> 数据结构与算法之美 ---------------------------------- ...

最新文章

  1. C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
  2. Asp.net Mvc视频教程 页面传值基础(get/post/UpdateModel)
  3. XT711(大陆行货)刷机与优化指南
  4. mysql 变量is null 和 not exists区别
  5. Interview:算法岗位面试—10.31下午上海某银行总部公司(二面,四大行之一)之项目简介、比赛介绍、某个比赛的过程
  6. 将十六进制的字符串转化为UIImage
  7. 虚方法表与动态分派机制详解
  8. 服务器里怎么维修装备,教你在服务器加自己的装备
  9. Java 匿名内部类理解
  10. python编写正则表达式匹配单词_Python正则表达式匹配整个单词
  11. clion在使用sqlite3的时候,显示Undefined symbols for architecture x86_64错误的解决办法
  12. ES6新特性_ES6语法糖_ES5中构造函数的继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记035
  13. 推荐一款MD神器吧:重度MD用户必备神器
  14. ssm-学子商城-项目第六天
  15. JS实现动态生成二维码,并在中间插入logo
  16. FPGA状态机跑飞 的解决办法
  17. erlang底层c定时器设计-Erlang源码学习二
  18. mysql容灾方案_mysql 架构 ~异地容灾
  19. Single-Shot Object Detection with Enriched Semantics 论文笔记
  20. 怎么提高图片分辨率?如何改变图片的分辨率?

热门文章

  1. LeetCode MySQL 1398. 购买了产品A和产品B却没有购买产品C的顾客
  2. LeetCode MySQL 1435. 制作会话柱状图
  3. LeetCode 692. 前K个高频单词(优先队列)
  4. LeetCode 836. 矩形重叠
  5. LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)
  6. LintCode 1210. 升序子序列(DFS)
  7. LeetCode 1366. 通过投票对团队排名(自定义排序)
  8. linux串口数据异常,linux串口知识深入--收到数据异常问题处理
  9. matlab 思维数组_matlab多维数组
  10. clob和blob是不是可以进行模糊查询_你知道什么是 MySQL 的模糊查询?