Rhythmli's blog Rhythmli's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Rhythmli

知识就是财富
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • CSDN迁移

    • Spring IOC
    • Ngnix 阿里云
    • 最长回文子串
    • 面试题xuexixiexue
    • 哈希集合和哈希映射的简单设计
    • leetcode2021.11.03
    • Leetcode2021.11.2
    • JUC学习
    • 869. 重新排序得到 2 的幂
    • Java自动装箱拆箱
    • 55. 跳跃游戏
    • 剑指 Offer II 085. 生成匹配的括号
    • 300. 最长递增子序列
    • Java并发编程之美 01
    • 134. 加油站
    • 139. 单词拆分
    • 岛屿类问题题解
    • 138. 复制带随机指针的链表
    • 347. 前 K 个高频元素
    • 剑指 Offer II 026. 重排链表
    • 剑指 Offer II 025. 链表中的两数相加
    • 剑指 Offer II 014. 字符串中的变位词
    • 剑指 Offer II 010. 和为 k 的子数组
    • 剑指 Offer II 009. 乘积小于 K 的子数组
    • 剑指 Offer II 008. 和大于等于 target 的最短子数组
    • 剑指 Offer II 007. 数组中和为 0 的三个数
    • 剑指 Offer II 006. 排序数组中两个数字之和
    • 剑指 Offer II 002. 二进制加法
    • 129. 求根节点到叶节点数字之和
    • 113.路径总和 II
    • leetcode18. 四数之和
    • 编译OpenCV 以及 openc_contrib 提示缺少boostdesc_bgm.i文件出错的解决
    • fork()浅学习
    • SSM 增删改查
    • springmvc helloworld
    • Spring01 hello实验
    • 树的DFS和BFS
    • leetcode——二分法
    • Halo博客搭建
    • 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接---转载
    • opencv+python+OpenPose姿态实时识别
    • 03.KNN算法 李航统计学习方法
    • 02.感知机 李航统计学习方法
    • 01.最小二乘法拟合 李航统计学习方法
    • Pycharm atplotlib.pyplot图像不显示解决方法
    • 论文阅读01 SVM+kNN图像分类
    • Java简单实现计算器——用数组实现栈
    • 【剑指Offer3】无重复字符的最长子串
    • 【剑指Offer5】最长回文字符串
    • TF-IDF求取文本相似度
    • JAVA_day02
    • JAVA_day01
    • 递归产生回文数
    • 中国象棋QT登录注册以及悔棋功能
    • STM32F4学习笔记(基础介绍篇)
    • leetcode_04 递归,回溯与分治
    • leetcode03_贪心算法
    • leetcode01--链表
    • leetcode_02栈
      • leetcode_02栈
        • 栈
        • 例1.用队列实现栈
        • 例2.用栈实现队列
        • 例3.最小栈
        • 例4.合法的输出序列
        • 堆
        • 例1.数组中的第K个最大元素
    • Docker学习入门
    • C/C++编译与链接 程序员的自我修养:链接 装载和库
    • Nginx简单学习
    • JAVA网络编程
    • JVM初步学习
    • Spring简单学习
    • 标准项目格式
    • 设计模式中的几个原则
    • Redis和IDEA简单创建及增删改查
    • Mybatis快速入门01
    • Redis全程学习笔记(附带学习的视频教程)
    • QT入门学习中最基础的那些事儿
    • QT中文输出错误问题:C2001
    • OOP:面向对象编程
    • LINUX常用命令集合(待续)
    • 《C和指针》简单学习笔记
    • 二叉树,栈存储及遍历小程序
    • 数据结构简单学习笔记
    • 扑克牌
    • C++动态内存和智能指针
    • 设计模式之简单工厂模式
    • leetcode_01数组
    • 嵌入式Linux移植应用
    • LINUX 进程与线程 信号量 通信
  • 技术
  • CSDN迁移
梁山话事人
最新推荐文章2024-06-04
目录

leetcode_02栈

原文链接:https://blog.csdn.net/qq_39355828/article/details/113447700 (opens new window)

# leetcode_02栈

# 栈

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

C++模板编程

S.top()∶取出栈顶

S.empty:判断栈是否为空

S.push()∶将x添加至栈

S.pop()∶弹出栈顶

S.size0:栈的存储元素个数

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    queue<int> Q;
    if(Q.empty())
    {
        printf("Q is empty\n");
    }
    Q.push(5);//向队列中放入元素5;
    Q.push(6);
    Q.push(10);
    printf("Q.front=%d\n",Q.front());
    Q.pop();//出队,先入的先出 5出去
    Q.pop();//先入先出,6出去
    printf("Q.front= %d\n",Q.front());
    Q.push(1);//向队列中放入1
    printf("Q.back= %d\n",Q.back());//队尾数字
    printf("Q.size=%d\n",Q.size());
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 例1.用队列实现栈

使用队列实现栈的下列操作:

push(x) – 元素 x 入栈

pop() – 移除栈顶元素

top() – 获取栈顶元素

empty() – 返回栈是否为空

注意:

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

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

你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/implement-stack-using-queues

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:队列是先进先出,栈是先进后出,用一个临时队列,考虑到队列先进先出,先将需要的数字押进临时栈中,此时新元素成为头部元素,再将所有元素从临时栈搞到栈中,此时新元素最先进入队列,从而保证最先出来,实现了后进先出。

#include<iostream>
#include<queue>
using namespace std;
class MyStack{
public: MyStack(){}
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();
    }
}
int pop()//栈顶元素弹出动作
{
int x=_data.front();//获取栈顶元素,即为队列头部元素
_data.pop();
return x;
}
int top()
{
    return _data.front();
}
bool empty()
{
    return _data.empty();
}
private:
    queue<int> _data;
};
int main()
{
    MyStack myStack;
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);
    printf("栈顶元素为: %d\n",myStack.top());

    printf("弹出元素为: %d\n",myStack.pop());
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 例2.用栈实现队列

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

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾

int pop() 从队列的开头移除并返回元素

int peek() 返回队列开头的元素

boolean empty() 如果队列为空,返回 true ;否则,返回 false

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/implement-queue-using-stacks

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:用栈实现队列,必须使得新元素在栈底。用一个临时栈,先将所有元素导入临时栈,使得顺序倒置,然后将新元素导入临时栈,从临时栈中向栈倒数据,从而新元素在最底下。

#include<iostream>
#include<stack>
using namespace std;
class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {

    }

    /** Push element x to the back of queue. */
    void push(int x) {
        std::stack<int>temp_stack;//将栈中元素临时push到栈中

        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:std::stack<int>_data;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 例3.最小栈

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

push(x) —— 将元素 x 推入栈中。

pop() —— 删除栈顶的元素。

top() —— 获取栈顶元素。

getMin() —— 检索栈中的最小元素。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/min-stack

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:同时设置一个栈存储最小值,比较新元素,如果更小则更新压入最小值栈,不小则压入重复值,删除时同时弹出。

#include<iostream>
#include<stack>
class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {

    }

    void push(int x)
    {
        _data.push(x);
        if(_min.empty())
            _min.push(x);
        else{
            if(x>_min.top())
            {x=_min.top();}

        _min.push(x);}
    }

    void pop() {
      _data.pop();
      _min.pop();
    }

    int top() {
     return _data.top();
    }

    int getMin() {
      return _min.top();
    }
private:
    std::stack<int>_data;
    std::stack<int>_min;
};
int main()
{
    MinStack minStack;
    minStack.push(-2);
    printf("top=[%d]\n",minStack.top());
    printf("top=[%d]\n",minStack.getMin());
    minStack.push(0);
    printf("top=[%d]\n",minStack.top());
    printf("top=[%d]\n",minStack.getMin());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 例4.合法的输出序列

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]

输出:true

解释:我们可以按以下顺序执行:

push(1), push(2), push(3), push(4), pop() -> 4,

push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/validate-stack-sequences

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

在这里插入图片描述

#include<iostream>
#include<queue>
#include<stack>
using namespace std;
bool check_is_valid_orders(queue<int>&order)
{
    stack<int>s;//S为模拟栈
    int n=order.size();
    printf("n=%d\n",n);
    for(int i=1;i<=n;i++)
    {
        s.push(i);
        while(order.front()==s.top()&&!s.empty())
        {
            s.pop();
            order.pop();
            printf("order.front(): %d\n",order.front());
            printf("s.top(): %d \n",order.front());
        }
    }
    if(s.empty())
    {return true;}
    return false;
}
int main()
{
   queue<int>order;
   order.push(3);
    order.push(2);
    order.push(1);
    order.push(4);
    order.push(5);

    if(check_is_valid_orders(order))
    {printf("yes");}
    else
        printf("No");
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 堆

二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;

最小堆:父结点的键值总是小于或等于任何一个子节点的键值。

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    priority_queue<int, vector<int>, less<int>> big_heap;//最大堆的定义方法
    priority_queue<int, vector<int>, greater<int>> samll_Heap;//最小堆定义方法
    if(big_heap.empty())
        printf("big_heap is empty\n");
    int test[]={6,10,1,7,99,4,33};
    for(int i=0;i<7;i++)
    {
        big_heap.push(test[i]);
    }
    printf("big_heap.top=%d\n",big_heap.top());
    big_heap.push(1000);
    printf("big_heap.top=%d\n",big_heap.top());
    for(int i=0;i<3;i++)
    {
        big_heap.pop();
    }
    printf("big_heap.top=%d\n",big_heap.top());
    printf("big_heap.size()=%d\n",big_heap.size());
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 例1.数组中的第K个最大元素

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

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
1
2

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
1
2

思路:比如要寻找第k大的数,则建立大小为k的一个堆,

#include<vector>
#include<queue>
#include<iostream>
using namespace std;
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();//返回栈顶
    }
};
int main()
{
    Solution s1;
    vector<int>nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(4);
    nums.push_back(5);
    int k=3;
    printf("%d\n",s1.findKthLargest(nums,k));
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
           Q.pop();
           Q.push(nums[i]);
       }
   }
   return Q.top();//返回栈顶
}
1
2
3
4
5
6
7

};

int main()

{

Solution s1;

vectornums;

nums.push_back(1);

nums.push_back(2);

nums.push_back(3);

nums.push_back(4);

nums.push_back(5);

int k=3;

printf("%d\n",s1.findKthLargest(nums,k));

return 0;

}

编辑 (opens new window)
#leetcode刷题#订阅专栏#查看详情#C++
上次更新: 2026/08/11, 13:36:18
leetcode01--链表
Docker学习入门

← leetcode01--链表 Docker学习入门→

最近更新
01
Spring IOC
03-31
02
Git修改分支名
08-11
03
CSS给table的tbody添加滚动条
06-29
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式