牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用

简介: 牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用

一、斐波那契数列


1、题目要求



2、个人题解


2.1、解题思路


首先根据题目我们得知当n等于1或者2的时候,该函数计算结果为1,那么就先处理这种情况

接下来在n大于2的情况下讨论问题,此时由题可得函数返回结果依赖于n为1或者2的返回值,那么我们就想到利用递归来解这道题。

不断递推,当有结果出现时开始逐步回溯。


2.2、代码实现


class Solution {
public:
    int Fibonacci(int n) {
        if(n==1||n==2){
            return 1;
        }
        if(n>2)
            return Fibonacci(n-1) + Fibonacci(n-2);
        return -1;
    }
};


2.3、代码解析


首先当n等于1或者2的时候,返回结果为 1

当n大于2时,调用自身的递归:

Fibonacci(n-1) + Fibonacci(n-2)会逐步缩小形参的值

当形参为1或者2时得到结果并开始回溯,最终得到正确结果

最后的return -1 是为了防止非法输入。


二、用两个栈实现队列


1、题目要求



2、个人题解


2.1、解题思路


既然是两个栈实现队列功能,那么一定要理解栈和队列的差异:

栈:一端封闭,只能对栈顶操作,先进后出

队列:不封闭,对两端操作,先进先出

对两个栈进行压栈和删除栈顶元素的操作,拼接成队列的特点


2.2、代码实现


class Solution
{
public:
    //push操作都会把元素压入栈1
    void push(int node) {
        stack1.push(node);
    }
    int pop() {
        while(!stack1.empty()){       //栈1不空时将
            stack2.push(stack1.top());//栈顶元素压进栈2
            stack1.pop();             //将此次栈顶删去
        }
        int res = stack2.top();//res是每次pop的返回值
        stack2.pop();          //将栈2的栈顶元素删除
        while(!stack2.empty()){       //当栈2不空时
            stack1.push(stack2.top());//将栈顶元素压进栈1
            stack2.pop();             //随后删除栈2此次栈顶元素
        }
        return res;
    }
private:
    stack<int> stack1;//栈1
    stack<int> stack2;//栈2
};


2.3 代码解析


push函数没什么好分析的,就是直接将元素值压入栈1,重点在pop函数:


当栈1不空时,依次将栈中元素压入到栈2中

经过两次压栈操作,此时栈2的栈顶元素顺序就是队列栈顶的顺序

那么此时栈2的栈顶元素stack2.top()就是我们要返回的值

记录之后从栈中删除

然后判断栈2不为空的情况:

依次将剩下元素压进栈1中

下次再调用pop函数时也是两次压栈,顺序与队列顺序一致

测试后代码通过所有案例,每一步我都加了注释,方便大家吸收理解

相关文章
|
5天前
数据结构(栈与列队)
数据结构(栈与列队)
11 1
|
9天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
37 1
|
6天前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
9 0
|
11天前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
18天前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
84 64
|
11天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
16 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11天前
初步认识栈和队列
初步认识栈和队列
35 10
|
27天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
|
11天前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
28 3
|
12天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
25 2