数据结构和算法——栈、队列、堆

文章目录

        • 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;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综述 | 北斗系统应用趋势分析

来源&#xff1a;智绘科服初审&#xff1a;张艳玲复审&#xff1a;宋启凡终审&#xff1a;金 君一、前言2020年6月23日&#xff0c;北斗三号最后一颗组网卫星成功发射。2020年7月31日&#xff0c;北斗三号建成暨开通仪式举行&#xff0c;北斗三号全球卫星导航系统正式开通[1]…

数据结构与算法——贪心算法

文章目录1.分发饼干1.1 题目描述1.2 解题思路1.3 C实现2.摆动序列2.1 题目描述2.2 解题思路2.3 C实现3.移掉K位数字3.1 题目描述3.2 解题思路3.3 C实现4.跳跃游戏4.1 题目描述4.2 解题思路4.3 C实现5.跳跃游戏 II5.1 题目描述5.2 解题思路5.3 C实现6.用最少数量的箭引爆气球6.1…

人为什么要睡觉?科学家给出进一步答案

来源&#xff1a;科技日报作者&#xff1a;张佳欣 人类一生中有三分之一的时间在睡觉&#xff0c;包括苍蝇、蠕虫甚至水母等无脊椎动物也会睡觉。在整个进化过程中&#xff0c;睡眠对所有具有神经系统的有机体来说都是普遍的&#xff0c;也是必不可少的。然而你有没有想过&…

操作系统——简介

文章目录1.操作系统的功能和目标1.1 作为用户和计算机硬件之间的接口1.2 作为系统资源的管理者1.3 作为最接近硬件的层次2.操作系统的概念、功能和目标3.操作系统的四大特征3.1 并发3.2 共享3.3 虚拟3.4 异步4.操作系统的运行机制4.1 两种指令4.2 两种处理器状态4.3 两种程序5.…

Andrew Gelman、Aki Vehtari​ | 过去50年最重要的统计学思想是什么?

来源&#xff1a; 数据分析网作者 &#xff1a;Andrew Gelman 美国统计学家、哥伦比亚大学统计学教授Aki Vehtari 阿尔托大学计算机科学系副教授近日&#xff0c;图灵奖得主、“贝叶斯网络之父”Judea Pearl在Twitter上分享了一篇新论文“What are the most important statis…

全局唯一ID的生成

数据在分片时&#xff0c;典型的是分库分表&#xff0c;就有一个全局ID生成的问题。单纯的生成全局ID并不是什么难题&#xff0c;但是生成的ID通常要满足分片的一些要求&#xff1a; 1 不能有单点故障。 2 以时间为序&#xff0c;或者ID里包含时间。这样一是可以少一个索引…

操作系统——进程

文章目录1.进程的定义2.进程的组成3.PCB4.进程的状态4.1 进程的五种状态4.2 进程状态间的转换5.进程控制6.进程通信6.1 共享存储6.2 管道通信6.3 消息传递7.线程7.1 线程的概念7.2 引入线程后的变化7.3 线程的属性7.4 线程的实现方式7.4.1 用户级线程7.4.2 内核级线程7.4.3 混合…

10分钟了解图卷积神经网络的常用算法和发展方向

来源&#xff1a;数学算法俱乐部近几年&#xff0c;机器学习在各个领域井喷式发展&#xff0c;现已成为当下最热门的技术。掌握机器学习&#xff0c;你就比 80% 的人更具备竞争优势。谷歌的无人驾驶、抖音的推荐系统、百度的人脸识别、大疆的无人机、科大讯飞的语音识别、小米的…

操作系统——调度

文章目录1.调度的概念2.调度的三个层次2.1 高级调度2.2 中级调度2.3 低级调度2.4 三种调度之间的关联1.调度的概念 2.调度的三个层次 2.1 高级调度 2.2 中级调度 2.3 低级调度 2.4 三种调度之间的关联

诺奖得主被曝40多篇论文造假!

来源&#xff1a;科研城邦截止2021年11月6日&#xff0c;Gregg L. Semenza教授针对其在Pubpeer被挂的52篇论文&#xff0c;进行了至少6篇文章的纠正&#xff0c;且撤回了1篇文章。离谱的是&#xff0c;这位美国约翰霍普金斯大学教授&#xff0c;正是2019年诺贝尔生理学或医学奖…

操作系统——死锁

文章目录1.死锁的概念2.死锁产生的必要条件3.什么时候会发生死锁4.死锁的处理策略4.1 预防死锁4.1.1 破坏互斥条件4.1.2 破坏不剥夺条件4.1.3 破坏请求和保持条件4.1.4 破坏循环等待条件4.2 避免死锁4.2.1 安全序列4.2.2 银行家算法1.死锁的概念 2.死锁产生的必要条件 3.什么时…

苏联的三进制电脑,为什么被二进制干掉了?

来源&#xff1a;差评 当我们在电脑上打开一个软件&#xff0c;看一部电影&#xff0c;听一首歌的时候&#xff0c;我们很难想象&#xff0c;这些东西都是由 0 和 1 这样的二进制数字组成的。但你有没有好奇过&#xff1f;为什么计算机要用二进制呢&#xff1f;难道是因为它效…

linux标准I/O——标准I/O介绍

文章目录1.文件的相关概念1.1 什么是文件1.2 文件类型2.标准I/O概念2.1 什么是标准I/O2.2 FILE和流2.3 流的缓冲类型2.4 stdin&#xff0c;stdout和stderr1.文件的相关概念 1.1 什么是文件 \qquad一组相关数据的有序集合 1.2 文件类型 文件类型表示举例常规文件r文本文件、二…

70页论文,图灵奖得主Yoshua Bengio一作:「生成流网络」拓展深度学习领域

来源&#xff1a;机器学习研究组订阅GFlowNet 会成为新的深度学习技术吗&#xff1f;近日&#xff0c;一篇名为《GFlowNet Foundations》的论文引发了人们的关注&#xff0c;这是一篇图灵奖得主 Yoshua Bengio 一作的新研究&#xff0c;论文长达 70 页。在 Geoffrey Hinton 的「…

linux标准I/O——流的打开和关闭

文章目录1.打开流2.mode参数3.fopen举例4.新建文件权限5.处理错误信息6.关闭流1.打开流 2.mode参数 3.fopen举例 #include<stdio.h> int main() {FILE *fp;fpfopen("a.txt","r");if(fpNULL){printf("fopen error\n");return -1;}return 0…

卷积神经网络数学原理解析

来源&#xff1a;海豚数据科学实验室作 者&#xff1a;Piotr Skalski翻 译&#xff1a;通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#xff09;编 辑&#xff1a;Pita 原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural N…

【大数据】分布式集群部署

1、集群规划部署 节点名称NN1NN2DN RMNMhadoop01NameNode DataNode NodeManagerhadoop02 SecondaryNameNodeDataNodeResourceManagerNodeManagerhadoop03 DataNode NodeManager2、参考单机部署&#xff0c;拷贝安装目录至相同目录&#xff0c;使用ln -s 建立软连接 3、修改配置…

linux标准I/O——按字符输入和输出

文章目录1.流的读写方式2.按字符输入3.举例3.1 从键盘读取一个字符&#xff0c;并打印到终端上3.2 读取一个文件&#xff0c;并打印文件中的字符数目3.3 自行输入要查看的文件&#xff0c;并打印文件中的字符数目4.按字符输出5.举例5.1 从键盘读入&#xff0c;并打印到终端5.2 …

周志华教授:关于深度学习的一点思考

来源&#xff1a;专知1 引言 深度学习已被广泛应用到涉及图像、视频、语音等的诸多任务中并取得巨大成功。如 果我们问“深度学习是什么&#xff1f;”很可能会得到这样的回答&#xff1a;“深度学习就是深度神经网 络”。至少在目前&#xff0c;当“深度学习”作为一个术语时几…

linux标准I/O——按行输入和输出

文章目录1.按行输入函数2.从键盘读入&#xff0c;并打印3.按行输出4.键盘输入字符串&#xff0c;写入文本5.将文本中的字符串按行读出到buf中&#xff0c;并打印buf1.按行输入函数 2.从键盘读入&#xff0c;并打印 #include<stdio.h> #include<string.h>#define N…