leetcode【数据结构简介】《队列&栈》卡片——栈:后入先出的数据结构

字节Leetcode刷题笔记,看完吊打问你算法的面试官 无论校招还是社招,技术面试中多多少少都会问到数据结构与算法相关的问题。例如最直接的一种,面试官上来就让手写一个快排的代码,或者给一段代码,要求分析时间复杂度和空间复杂度。其次,日常繁杂的业务工作往往容易让人忽略程序实现细节和原理。就 Java 来说,无论是其自身的基础 API,还是第三方提供的开源框架,都糅合很多优秀的数据结构和算法的设计思想。​ 最后,如果不重视程序的性能好坏,日复一日业务开发显然无法持续提升个人的编程和设计能力。而提升代码质量的第一步,就是建立起时间复杂度、空间复杂度的意识。 阅读详情

Author : Authur_Whywait. 忍不住化身一块疯狂吸收知识的海绵。( ̄︶ ̄)↗ 
想看博主的其他所有leetcode卡片学习笔记链接?传送门点这儿

本文中,我们将介绍另一种处理顺序后入先出(LIFO),以及相应的数据结构栈。

阅读本文之后,你将get以下技能:

  • 理解 LIFO 和 栈的定义;
  • 能够用动态数组实现栈;
  • 熟悉内置栈结构;
  • 能够使用栈解决问题。

后入先出的数据结构

在这里插入图片描述

在 LIFO 数据结构中,将首先处理添加到队列中的最新元素。

与队列不同,栈是一个 LIFO 数据结构。

  1. 插入操作在栈中被称作入栈 push 。与队列类似,总是在堆栈的末尾添加一个新元素。
  2. 删除操作,退栈 pop ,将始终删除队列中相对于它的最后一个元素。

栈的实现比队列容易。使用动态数组足以实现堆栈结构。下面提供了一个简单栈的实现(C++版本)

#include <iostream>

class MyStack {
    private:
        vector<int> data;               // store elements
    public:
        /** Insert an element into the stack. */
        void push(int x) {
            data.push_back(x);
        }
        /** Checks whether the queue is empty or not. */
        bool isEmpty() {
            return data.empty();
        }
        /** Get the top item from the queue. */
        int top() {
            return data.back();
        }
        /** Delete an element from the queue. Return true if the operation is successful. */
        bool pop() {
            if (isEmpty()) {
                return false;
            }
            data.pop_back();
            return true;
        }
};

int main() {
    MyStack s;
    s.push(1);
    s.push(2);
    s.push(3);
    for (int i = 0; i < 4; ++i) {
        if (!s.isEmpty()) {
            cout << s.top() << endl;
        }
        cout << (s.pop() ? "true" : "false") << endl;
    }
}

栈 - 用法

大多数流行的语言都提供了内置的栈库,因此你不必重新发明轮子。除了初始化,我们还需要知道如何使用两个最重要的操作:入栈和退栈。除此之外,你应该能够从栈中获得顶部元素。
下面是C++语言版本关于栈的实现的代码实例:

#include <iostream>

int main() {
    // 1. Initialize a stack.
    stack<int> s;
    // 2. Push new element.
    s.push(5);
    s.push(13);
    s.push(8);
    s.push(6);
    // 3. Check if stack is empty.
    if (s.empty()) {
        cout << "Stack is empty!" << endl;
        return 0;
    }
    // 4. Pop an element.
    s.pop();
    // 5. Get the top element.
    cout << "The top element is: " << s.top() << endl;
    // 6. Get the size of the stack.
    cout << "The size is: " << s.size() << endl;
}

至于C,之前在队列的相关博文中就已经了解到,C并没有内置的队列库,自然,内置的栈库也是不存在的。(╯‵□′)╯︵┻━┻

相关程序练习

1. 最小栈

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

  • push(x) – 将元素 x 推入栈中。
  • pop() – 删除栈顶的元素。
  • top() – 获取栈顶元素。
  • getMin() – 检索栈中的最小元素。

Tips

和当初设计队列的时候一样,释放栈的时候要先释放对象中的数据结构(此情况下为数组),然后再释放对象;

void minStackFree(MinStack* obj) {
    free(obj->val);
    free(obj);
}

说明

因为栈属于LIFO的数据结构,所有的操作基本上都是只对top指针的操作,所以我在定义栈的时候,并没有将base指针写进去。

代码实现以及执行结果

typedef struct {
    int* val;
    int top;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* obj = (MinStack *)malloc(sizeof(MinStack));
    if(!obj) return NULL;
    obj->val = (int *)malloc(sizeof(int) * 10000);
    obj->top = 0;
    return obj;
}

void minStackPush(MinStack* obj, int x) {
    obj->val[obj->top++] = x;
}

void minStackPop(MinStack* obj) {
    obj->top--;
}

int minStackTop(MinStack* obj) {
    return obj->val[obj->top-1];
}

int minStackGetMin(MinStack* obj) {
    int min=minStackTop(obj);
    for(int i=0; i<obj->top; i++)
        min = min < obj->val[i] ? min : obj->val[i];
    return min;
}

void minStackFree(MinStack* obj) {
    free(obj->val);
    free(obj);
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, x);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackGetMin(obj);
 
 * minStackFree(obj);
*/

在这里插入图片描述

2. 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

输入: “()[]{}”
输出: true

输入: “([)]”
输出: false

分析

主要分为以下几种情况:

  1. 如果是左括号系列直接入栈
  2. 如果是右括号系列且与栈顶元素匹配则栈顶元素出栈
  3. 如果是右括号系列且与栈顶元素不匹配,则返回false
  4. 如果整个字符串遍历结束,栈内仍用元素,则返回false;否则,返回true。

Tips

是否曾经有个想法在你脑海里浮现:一共三种类型六个括号,去判断他们是否匹配,得多麻烦啊,判断条件不得写一堆。

有一种方法是另写一个函数,专门判断两个新的括号和栈顶元素的括号是否匹配。

直接调用函数确实能减少代码量,但是我的小脑袋瓜灵光一下,有了一个自以为妙到绝处的想法。

将符号数字化。

什么是数字化呢?就是用数字来取代符号。我们按照我们的需要(判断是否匹配),将六个不同的括号按一定顺序放到一个字符串里面char symbol[7]="{[()]}";。

为什么方括号里面的是7而不是6呢?因为一个字符串还有一个’\0’作为结束符。

如此这般,将括号转换为其索引(从0开始),那么判断两个括号是否匹配就变成它们两者的索引之和是否为5。至于左括号系列的就是index<3的部分,剩下的部分就都属于右括号系列了。

有其他的好方法一定要留言告诉我哦~ Ψ( ̄∀ ̄)Ψ

代码实现以及执行结果

typedef struct{
    int array[10000];
    int top;
} Stack;

bool isValid(char * s){
    if(!s) return true;
    char symbol[7]="{[()]}";
    Stack *S = malloc(sizeof(Stack));
    S->top = 0;

    for(int i=0; i<strlen(s); i++){
        int pos=0;
        for( ; pos<6; pos++) if(symbol[pos]==s[i]) break;
        if(pos<3) S->array[S->top++] = pos;
        else {
            if(S->top>0 && S->array[S->top-1]+pos==5) S->top--;
            else return false;
        }
    }
    if(S->top) return false;
    else return true;
}

在这里插入图片描述

3. 每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

分析

懵逼树上懵逼果。懵逼树下你和我。

这题的解题方法有二,一为暴力法,一为使用栈。因为本文主题需要,本题使用栈来解题。

(暴力法就算了,一个难度中等的题目使用暴力法有点说不过去 ━┳━ ━┳━)

根据题目信息,我们需要找到比当前 T[i] 温度更高的位置,那么必须要记录哪些信息?

我们试着找到 T[0] 过后温度升高的位置。如果知道 T[10]=50,则 T[20]=50 是无效信息,因为 T[i] 在 T[20] 以前已经到达了 50。如果 t[20]=100 将是有用的信息,因为如果 t[0]=80,那么 T[20] 将有可能是它的下一个温度升高的位置,而 T[10] 则不可能是。

因此,我们需要记住一个索引的列表,索引代表的温度严格递增。我们可以利用栈来实现这样的效果。

是不是看不懂?莫得关系。下面的算法部分有举例,对照着例子,再看分析部分,就能理解啦。

算法

我们用栈记录索引,满足 T[stack[-1]] < T[stack[-2]] < …,其中 stack[-1] 是栈的顶部,stack[-2] 是从顶部开始的第二个元素,依此类推;我们将在处理每个 T[i] 时保持 stack[-1] > stack[-2] > …。

我们通过当前温度和栈顶索引所代表的温度比较来找到温度升高的位置。

举个例子:我们反向遍历处理 t=[73,74,75,71,69,72,76,73] ,通过看栈元素的变化来理解是如何工作的。为了清楚 stack 只包含索引 i,但是将把 T[i] 的值写在旁边的括号中,例如 0 (73)。
当 i = 7,stack = [7 (73)]。ans[i] = 0。
当 i = 6,stack = [6 (76)]。ans[i] = 0。
当 i = 5,stack = [5 (72), 6 (76)]。ans[i] = 1。
当 i = 4,stack = [4 (69), 5 (72), 6 (76)]。ans[i] = 1。
当 i = 3,stack = [3 (71), 5 (72), 6 (76)]。ans[i] = 2。
当 i = 2,stack = [2 (75), 6 (76)]。ans[i] = 4。
当 i = 1,stack = [1 (74), 2 (75), 6 (76)]。ans[i] = 1。
当 i = 0,stack = [0 (73), 1 (74), 2 (75), 6 (76)]。ans[i] = 1。

代码实现以及执行结果

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

typedef struct{
    int* array;
    int top;
} Stack;

int* dailyTemperatures(int* T, int TSize, int* returnSize){
    * returnSize = TSize;
    if(! TSize) return NULL;
    
    int* waitingdays = malloc(sizeof(int) * TSize);

    Stack * S = (Stack *)malloc(sizeof(Stack));
    S->array = (int *)malloc(sizeof(int) * TSize);
    S->top = 0;
    
    for(int i=TSize-1; i>-1; i--){
        if(S->top>0 && T[i]>=T[S->array[S->top-1]]){
            S->array[S->top++] = i;
            while(S->top>1 && T[S->array[S->top-1]]>=T[S->array[S->top-2]]){
                S->array[S->top-2] = S->array[S->top-1];
                S->top--;
            }
        }
        else S->array[S->top++] = i;
            
        if(S->top>1) waitingdays[i] = S->array[S->top-2] - S->array[S->top-1];
        else waitingdays[i] = 0;
    }
    return waitingdays;
}

在这里插入图片描述

4. 逆波兰表达式求值

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

输入: [“2”, “1”, “+”, “3”, “*”]
输出: 9
解释: ((2 + 1) * 3) = 9

分析

此题一看,马上用栈。但是,最棘手的问题不是栈的使用,而是,字符串转数字。。。(╯‵□′)╯︵┻━┻

每个字符串的字符长度不确定,可能还带有负号。用上以前讲的c-‘0’,确实有那么点方便起来,但是真的也就只有那一点点了。

于是乎,就在这个时候,白马王子踩着筋斗云来拯救我们啦!蹬蹬蹬瞪,atoi函数华丽登场!

关于atoi函数的作用和用法,请进入传送门小白笔记本【函数篇】(updating)

其后就只剩代码实现了。

代码实现及执行结果

int evalRPN(char ** tokens, int tokensSize){
    int stack[tokensSize];
    int top=-1;
    int a, b;
    for (int i=0; i<tokensSize; i++){
        if (strcmp(tokens[i], "+") == 0){
            a = stack[top--];
            b = stack[top--];
            stack[++top] = b + a;
        }
        else if (strcmp(tokens[i], "-") == 0){
            a = stack[top--];
            b = stack[top--];
            stack[++top] = b - a;
        }
        else if (strcmp(tokens[i], "*") == 0){
            a = stack[top--];
            b = stack[top--];
            stack[++top] = b * a;            
        }
        else if (strcmp(tokens[i], "/") == 0){
            a = stack[top--];
            b = stack[top--];
            stack[++top] = b / a;            
        }
        else stack[++top] = atoi(tokens[i]);
    }
    return stack[top];
}

在这里插入图片描述

都看到这里了,确定不点个赞再走?(╹ڡ╹ )

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体 本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。 阅读详情

相关推荐

Unity通过Vosk实现离线语音识别方法

以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。

qq_39515892的博客 2070

leetcode【数据结构简介】《队列&栈》卡片 - 小结

包括以下六道队列和栈的相关练习题:1.用栈实现队列; 2. 用队列实现栈;3. 字符串解码; 4. 图像渲染; 5. 01矩阵; 6. 钥匙和房间

AuthurLEE's Blogs 5194

基于Ollama本地大模型的Python自动化翻译工具开发实践

本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。

yhn45678901的博客 560

leetcode【数据结构简介】《队列&栈》卡片——队列:先入先出的数据结构

Author: Authur Whywait, 一个努力学习知识的孩子 \ (0^ ◇^0)/ 文章目录先入先出的数据结构队列 - 实现循环队列**程序练习 - 设计循环队列**注意一: 关于释放链表操作注意二:关于删除操作所有操作的代码实现队列 - 用法 先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素。 如上图所示,队列是典型的 FIFO 数据结构。插入(...

AuthurLEE's Blogs 449

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3984

leetcode【数据结构简介】《队列&栈》卡片——队列和广度优先搜索

跟着我走完篇文章,如果还没有掌握BFS算法,你可以来打我。(关于队列在BFS算法中的应用,非常详细的介绍了三道BFS算法相关编程题。)

AuthurLEE's Blogs 519

C#开发的OpenRA游戏之网络接收后找到游戏对象

而这个队列是在创建这个游戏对象时组件,因为一个游戏对象有很多特性,当发现创建游戏对象时有IResolveOrder继承接口的对象,就添加到这个数组。在这里先检查一下命令是否有效的,接着就调用命令的执行对象,即是游戏对象来执行这个命令了。order.Subject就是上面解释游戏对象ID,并从游戏世界里找到的游戏对象,再从各个字段里找到对应的信息,再把这个动作交给游戏世界里的对象执行。从前面分析可知,要找到游戏世界里的对象,就需要游戏对象的ID,因此, 我们来分析游戏对象的ResolveOrder函数。

大坡3D软件开发 1034

leetcode卡片学习 - 索引(updating)

本文包含博主在leetcode卡片学习中所有博文的传送门。 随着博主的学习进度,实时更新。欢迎大家前来指出不足~

AuthurLEE's Blogs 640

Python爬虫零基础入门【第九章:实战项目教学·第17节】内容指纹去重:URL 变体/重复正文的识别!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 824

图神经网络实战(6)——使用PyTorch构建图神经网络

图数据集通常比简单的连接集合更加丰富,因为节点和边可以具有表示分数、颜色、单词等特征。包含这些额外信息在输入数据中对于生成最佳嵌入至关重要。在本节中,我们将使用 Cora 和 Facebook Page-Page 数据集,首先将它们视为表格数据集,观察香草神经网络在节点特征上的表现如何。然后,尝试在神经网络中加入拓扑信息,实现图神经网络 (Graph Neural Networks, GNN) 架构:一个同时考虑节点特征和边的简单模型。最后,我们将比较两种架构的性能。

盼小辉丶的博客 2万+

leetcode【数据结构简介】《队列&栈》卡片 - 栈和深度优先搜索

博主亲手绘制动态图,一张张截图,头发瞬间少了三千 ··· (关于栈以及dfs)

AuthurLEE's Blogs 1418

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1827

leetcode【数据结构简介】《链表》卡片——小结

用有趣的语言来讲解 链表相关 编程练习。 确定不进来逛一逛?

AuthurLEE's Blogs 395

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构基本功:设计最大频率栈

后台回复进群一起刷力扣????点击卡片可搜索关键词????读完本文,可以去力扣解决如下题目:895.最大频率栈(Hard)我个人很喜欢设计特殊数据结构的问题,毕竟在工作中会经常用到基本数...

fdl123456的博客 647

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

今日不刷题,面试徒伤悲--力扣力扣

刷题策略参考如下,感兴趣的小伙伴可以移步学习 作者:Ikaruga 链接:https://leetcode-cn.com/circle/article/g2kEJt/ 来源:力扣(LeetCode) 年少不听李宗盛,听后已是曲终人。 1.数据结构基础刷一刷 在力扣主页上方的标签中,排在第一位的是一个叫 “探索” 的频道,进来会看到很多卡片。这其中有一些卡片,贴心的简直就像是新手教学,手把手的教你;另外一些卡片则是挑战集锦。如果遇到感觉很难的题目,那可能就是很难,千万别钻牛角尖。 数据结构 11

weixin_45406288的博客 197

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = &quot;R. B. Palm&quot;, title = &quot;Prediction as a candidate for learning deep hierarchical models of data&quot;, year = &quot;2012&quot;,}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er&lt;0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er &lt; 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free &quot;Bitdeli Badge&quot;)

栈与队列算法面试核心解析与实战技巧

栈与队列是计算机科学中最基础的线性数据结构,栈遵循LIFO(后进先出)原则,队列遵循FIFO(先进先出)原则。其O(1)时间复杂度的核心操作使它们成为解决特定问题的利器,如逆波兰表达式求值、括号匹配等场景。在技术面试中,约70%的候选人会在栈与队列题目上出现失误,主要原因是缺乏系统性训练。通过LeetCode经典题型如最小栈、用队列实现栈等案例,可以掌握数据结构特性与算法思想的结合应用。掌握这些基础数据结构对提升编程能力和通过技术面试至关重要,特别是在处理具有嵌套特性或需要保存历史状态的问题时。

weixin_30920853的博客 507

leetcode 232. Implement Queue using Stacks 用栈实现队列 python3

时间:2020-6-12 题目地址:https://leetcode-cn.com/problems/invert-binary-tree/ 题目难度:Easy 题目描述: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push

isabloomingtree的博客 242

队列数据结构:面试核心考察点与工程实践

队列是计算机科学中基础的数据结构,遵循先进先出(FIFO)原则,广泛应用于算法和系统设计中。从原理上看,队列通过维护头部和尾部指针实现高效操作,其变种如循环队列、双端队列和优先队列在不同场景下展现出独特优势。在技术面试中,队列常与BFS、滑动窗口等算法结合考察,同时作为消息队列的核心组件,在分布式系统中解决削峰填谷、异步处理等问题。以LeetCode高频题型为例,循环队列的边界处理、用栈实现队列的均摊复杂度分析都是典型考点。工程实践中,消息队列的幂等设计、死信队列和优先级处理等方案,更是系统设计面试的必备知

weixin_30906185的博客 404

力扣高频算法php_进互联网名企要刷多少道算法题?

春招马上就要开始了,想必有很多同学都在紧张地准备面试。算法和数据结构一直是技术面试的重点和难点,也是拿到 Offer 的必备敲门砖。一些头部互联网公司对面试者的算法水平要求更高,不止要求面试者能写出算法,还要求时间复杂度最小,找出最优方式。在这不到两个月的时间内,如何高效刷题拿到名企 offer?想要保证好的刷题效果,一份完备的刷题计划必不可少。本篇文章根据两位力扣用户的刷题经验分享整理,带你探索...

weixin_36168996的博客 827

Leetcode 栈与DFS探索卡片 94/494/133/200/150/739/155 (C++)

最近刷题数目上来了,一天能多刷几道,每道题发一个博客感觉有点耗时,就把当天刷的题目一起发上来做个总结; 昨天刷了栈与队列的卡片,中等难度的题目陡然增多,脑子开始有点不够用了,部分题目还是得看题解才会做,不过没关系,已经形成了一个解题思路,如果一天就能掌握DFS的各种应用那应该算是表现不错,下面看题 155 最小栈 设计一个支持push,pop,top操作,并能在常数时间内检索...

Mint2yx4的博客 514

字节大佬Leetcode刷题笔记,看完吊打问你算法的面试官

leetcode 题解,记录自己的 leetcode 解题之路。无论校招还是社招,技术面试中多多少少都会问到数据结构与算法相关的问题。例如最直接的一种,面试官上来就让手写一个快排的代码,或者给一段代码,要求分析时间复杂度和空间复杂度。其次,日常繁杂的业务工作往往容易让人忽略程序实现细节和原理。就 Java 来说,无论是其自身的基础 API,还是第三方提供的开源框架,都糅合很多优秀的数据结构和算法的设计思想。​ 最后,如果不重视程序的性能好坏,日复一日业务开发显然无法持续提升个人的编程和设计能力。

javaAnPou的博客 318

100天iOS数据结构与算法实战:配套应用‘啊!算法‘的使用指南与学习技巧

想要在iOS开发领域脱颖而出吗?想要掌握数据结构与算法的核心技能吗?这个**100天iOS数据结构与算法实战**计划正是为你量身定制的学习路线!🚀 通过系统化的100天学习计划,配合功能强大的"啊!算法"应用,你将从零基础成长为iOS算法高手。 ## 📱 "啊!算法"应用介绍 "啊!算法"是这个100天学习计划的配套iOS应用,它不仅仅是代码仓库的简单展示,更是一个**交互式学习平台**。

gitblog_01036的博客 370

每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min

1.给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。1.牌组中的每张卡牌都对应有一个唯一的整数。个位置能够储存号码。系统应该存储号码,检查某个位置是否为空,并清空给定的位置。1.给定一系列整数,插入一个队列中,找出队列中第一个唯一整数。),并且您可以假定对系统的调用是按时间顺序进行的(即。最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。1.请你设计一个队列,支持在前,中,后三个位置的。,可以访问队首元素、队尾元素和队列长度。,可以访问队首元素、队尾元素和队列长度。

2301_80044595的博客 861

结构pop_数据结构基本功:设计最大频率栈

后台回复进群一起刷力扣?点击卡片可搜索关键词?读完本文,可以去力扣解决如下题目:895.最大频率栈(Hard)我个人很喜欢设计特殊数据结构的问题,毕竟在工作中会经常用到基本数据结构,而设计类的问题就非常考验对基本数据结构的理解和运用。力扣第 895 题要求我们实现一个特殊的数据结构「最大频率栈」,比较有意思,让我们实现下面这两个 API:classFreqStack{//在...

weixin_39887846的博客 523

LeetCode刷题记录(五)

LeetCode刷题记录(五) 今天开始队列&amp;amp;栈卡片的学习。 1、设计循环队列 题目: 我的思路: 循环队列的工作原理可以参考LeetCode上的介绍,从介绍中我们可以看到: 可以定义一个数组来存储队列中的元素,循环队列定义了两个指针,一个指针指向的是队列的起始位置,一个指针指向的是队列的结尾; 当队列为空时,起始指针和尾指针都是指向的队列之外,向队列中添加一个元素之后,起始指针和尾...

记录只为更好地前行 517
上一篇: leetcode【数据结构简介】《队列&栈》卡片——队列和广度优先搜索
下一篇: leetcode报错之 runtime error: load of misaligned address 0x0000ffffffff for type 'int'...
AuthurLEE
博客等级 码龄8年 50粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AuthurLEE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值