前言

如果你发现数据结构看似难以掌握,我将尽力简化知识,将其转化为我们更容易理解的内容。我会确保你能够理解知识并顺利运用到实践中。

作为一个从事数据建模五年的专业人士,我参与了许多数学建模项目,了解各种模型的原理、建模流程和题目分析方法。我希望通过这个专栏让你能够快速掌握各类数学模型、机器学习和深度学习知识,并掌握相应的代码实现。每篇文章都包含实际项目和可运行的代码。我会紧跟各类数模比赛,将最新的思路和代码分享给你,保证你能够高效地学习这些知识。

博主非常期待与你一同探索这个精心打造的专栏,里面充满了丰富的实战项目和可运行的代码,希望你不要错过:一文速学-数学建模常用模型

一、栈

1.概念

在深度学习和机器学习领域,理解数据结构是非常重要的,因为它们在许多算法和模型的实现中起着关键作用。栈(Stack)是一种基本的数据结构,它遵循先进后出(Last In, First Out,LIFO)的原则。这意味着最后添加到栈中的元素将会首先被取出。

栈通常具有两个主要操作:

  1. 压栈(Push):将元素添加到栈的顶部。
  2. 出栈(Pop):从栈的顶部移除元素。

另外,栈还经常具有一个查看栈顶元素但不将其弹出的操作,通常称为顶栈(Peek)

在实际应用中,栈常用于处理函数调用、表达式求值、深度优先搜索等场景。在计算机科学和软件工程中,栈也是重要的基础数据结构,许多编程语言提供了内建的栈支持。

关于栈的理论基础,它可以通过链表或数组来实现。链表实现的栈允许动态分配内存,但访问元素可能会略慢一些。而数组实现的栈允许快速访问元素,但需要预先分配固定大小的内存空间。

栈的概念起源于计算机科学的早期阶段,它在算法和程序设计中有着广泛的应用。最早的栈实现是通过硬件指令集中的堆栈指令来实现的,用于处理函数调用和返回。

2.应用场景

虽然栈并不是最常用的数据结构,但它们仍然在某些情况下会发挥重要作用。

  1. 函数调用栈:在编写深度学习或机器学习代码时,你会经常调用各种函数。这些函数的调用关系可以用一个称为“函数调用栈”的数据结构来管理。每当你调用一个函数,它会被推送到栈中,当函数执行完毕后,它将会从栈中弹出。这保证了函数的调用顺序和返回顺序是正确的。

  2. 递归算法:许多深度学习和机器学习算法可以用递归的方式来实现,例如树的遍历和图的搜索。递归算法的本质就是将一个大问题拆解成许多小问题,这样每个小问题的解决都可以通过压栈和出栈来实现。

  3. 操作符优先级解析:在处理表达式计算或解析时,栈可以用于管理操作符的优先级。例如,将中缀表达式转换成后缀表达式,或者用栈来计算后缀表达式。

  4. 回溯算法:在某些深度学习任务中,可能需要采用回溯的方式来搜索最优解。栈可以用于记录搜索路径,以便在需要时回溯到之前的状态。

  5. 深度优先搜索(DFS):在图论中,深度优先搜索是一种重要的算法,它通过栈来实现。在深度学习中,可能会遇到需要对图结构进行遍历和搜索的情况,此时栈可以派上用场。

3.利用栈实现任意进制转换

栈有两种存储结构,顺序存储和链式存储,我们在这采用顺序存储。那么我们需要定义一个结构体,结构体里面有个int类型的数组,还有一个top用来存储栈顶元素的下标。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define Maxsize 100
using namespace std;
//顺序栈
typedef struct SqStack{
    int data[Maxsize];
    int top;
}SqStack;
//初始化
int Init_Sqstack(SqStack &S)
{
    S.top=-1;
}
//进栈
bool push_SqStack(SqStack &S,int x)
{
    if(S.top==Maxsize-1)
        return false;//栈满
    S.data[++S.top]=x;
    return true;
}
//出栈
bool pop_SqStack(SqStack &S,int &x)
{
    if(S.top==-1)
        return false;
    x=S.data[S.top];
    S.top--;
    return true;
}
void show_SqStack(SqStack S)
{
    for(int i=S.top;i>=0;i--)
    {
        printf("%d ",S.data[i]);
    }
}
int char_to_num(char *a,int x)
{
    int n;
    int c=0;
    int b[100];
    n=strlen(a);
    int sum=0;
    //printf("%d",n);
    for(int i=0;i<n;i++)
    {
        if(a[i]>='0'&&a[i]<='9')
            b[i]=(a[i]-'0');
        else
            b[i]=(a[i]-'A'+10);
    }
    while(n)
    {
        n--;
        sum+=b[c++]*pow(x,n);
        //printf("%d\n",sum);
    }
    return sum;
}
int main()
{
    SqStack S;
    Init_Sqstack(S);
    printf("请输入想要转化数的进制:");
    int i;
    scanf("%d",&i);
    printf("\n请输入想转化的进制:");
    int j;
    scanf("%d",&j);
    printf("\n请输入想要转化的数:");
    char s[100];
    scanf("%s", s);
    //printf(s);/*
    int m,x;
    m=char_to_num(s,i);
    while(m)
    {
        push_SqStack(S,m%j);
        m=m/j;
    }
    show_SqStack(S);
    //cout << "Hello world!" << endl;
    return 0;
}

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐