文章目录
目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、思维导图
二、栈
1.栈的基本概念
(1)栈的定义
栈是只允许在表的一端进行插入和删除操作的线性表,
(2)栈的特点
卡特兰数:n个不同的元素进栈时,出栈元素不同排列的个数为
2.栈的基本操作
这些基本操作可直接在答案中调用
3.栈的存储结构
(1)顺序栈
顺序栈是栈的重点,而链栈基本上与链表保持一致,所以这里重点讨论顺序栈;实际应用中更多的也是顺序栈。
顺序栈的存储结构与顺序表一样,一般也有两种表示方式:静态分配,动态分配;
静态分配
(参考王道版本)
//顺序栈的存储结构——静态分配
#define maxsize 100
typedef struct{
int Data[maxsize];//开一个长度为100的数组,用作栈
int top //定义top指针;
}SqStack;
初学者可能会在这里产生一点疑惑,为什么在这里定义一个int型的变量可以将其称之为指针呢?这里的指针并不是真正意义上的指针,我们知道,真正的指针存放的是一个地址,在这个栈(数组)中其实地址就是0,1,2,3,4,5......0号地址第一个元素,1号地址存第二个元素......,所以用top变量用来存放栈顶元素在数组当中的哪个位置。
此外,用静态分配的方式来表示一个栈时,我们只用了一个栈顶指针,没有用栈底指针,栈底指针是固定在栈底的,所以有没有都一样。我们需要重点关注的时栈顶指针的指向,在这里,栈顶指针一般是两种指向方式,两种指向方式的不同会导致一些具体操作的不同,为方便表示,我用手写的方式呈现:
下面基本操作仅以s.top=-1表示,s.top=0类比,很简单的
初始化
void InitSqStack(SqStack &S){
s.top=-1;
}
判断空
bool SqStackEmpty(SqStack &S){
if(s.top==-1){
return true;
}
else{
return false;
}
}
入栈
//入栈
bool Push(Sqstack &S,int x){
//首先判断空是否满
if(s.top==maxsize-1){
return false;
}
s.Data[++S.top]=x;
/*
s.Data[++S.top]=x;
这一行代码就是
s.top=s.top+1;
s Data[s.top]=x;
*/
return true;
}
出栈
//出栈
bool Pop(Sqstack &s,int &x){
//首先需要判断栈是否为空
if(s.top==-1){
return false;
}
x=s.Data[s.top--];
/*
x=s.Data[s.top--];
这行代码等效于
x=s.Data[s.top];
s.top=s.top-1;
*/
return true
}
读取栈顶元素
//读栈顶元素
int GetTop(SqStack S,int &x){
//首先需要判空
if(s.top==-1){
return false;
}
x=s.Data[s.top];
//这里将栈顶元素,赋值给变量x,因为这里参数传来的是&x(可以理解为x的地址)
//在这个函数内部修改x的值(也就是将栈顶元素赋值给x)在函数外,x的值同样被修改
//所以直接返回bool型即可,此时x的值已经被“返回”了;
return true;
}
动态分配
所谓的顺序栈的动态分配就是利用malloc函数在内存中动态的分配内存空间用来存放数据。下面我说明一下这个所谓的动态分配,首先看malloc函数,malloc函数的作用就是在内存中开辟一段地址连续的空间(更详细的内容请看c语言库函数)然后在这段地址连续的空间内进行操作,当空间存满时,就会动态分配,这时候一般使用realloc函数比如(int *)realloc(sizeof(int )*n