当前位置: 首页 > article >正文

数据结构-3.2.栈的顺序存储实现


一.顺序栈的定义:top指针指向栈顶元素

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{
    int data[MaxSize]; //静态数组存放栈中元素
    int top; //栈顶指针 
} SqStack; 
​
int main()
{
    SqStack S;//声明一个顺序栈(分配空间)
    //后续操作。。。 
    return 0;
}

3.实例:

栈顶指针为4,因为第五个元素e下标为4。


二.初始化栈以及判断栈是否为空:

:栈顶指针指向栈顶元素

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{
    int data[MaxSize]; //静态数组存放栈中元素
    int top; //栈顶指针 
} SqStack; 
​
//初始化栈
void InitStack(SqStack &S)
{
    S.top=-1; //初始化栈顶指针,由于一开始没有元素,所以指向-1 
} 
​
//判断栈空
bool StackEmpty(SqStack S) //此时只要方法的结果即可,不需要返回S,所以不用& 
{
    if( S.top==-1 )
    {
        return true; //栈空 
    } 
    else
    {
        return false; //不空 
    }
} 
​
int main()
{
    SqStack S;//声明一个顺序栈(分配空间)
    InitStack(S);
    //后续操作。。。 
    return 0;
}

三.进栈操作(插入元素):

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{
    int data[MaxSize]; //静态数组存放栈中元素
    int top; //栈顶指针 
} SqStack; 
​
//新元素入栈
bool Push(SqStack &S,int x)
{
    if( S.top==MaxSize-1 )//因为此时栈是静态数组,有最大存储范围,所以要判断是否栈满 
    {
        return false; //栈满,无法再插入新元素,报错 
    }
    //走到这儿说明栈没满
    S.top = S.top+1; //指针先加1-->腾出位置 
    S.data[S.top] = x; //新元素入栈 
    return true; 
} 
​
int main()
{
    return 0;
}

四.出栈操作(删除元素):

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{
    int data[MaxSize]; //静态数组存放栈中元素
    int top; //栈顶指针 
} SqStack;
​
//出栈操作
bool Pop(SqStack &S,int &x) //x有&,代表出栈操作里操作的x和函数调用者定义的x对应的是同一份数据,而不是复制品 
{
    if( S.top==-1 )
    {
        return false; //栈空,报错 
    }
    //走到这儿说明栈不为空
    x = S.data[S.top]; //栈顶元素先出栈
    S.top = S.top-1; //指针再减1
    return true; 
} 
​
int main()
{
    return 0;
}

五.读取栈顶元素的操作:

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{
    int data[MaxSize]; //静态数组存放栈中元素
    int top; //栈顶指针 
} SqStack;
​
//出栈操作
bool Pop(SqStack &S,int &x)
{
    if(S.top==-1)
    {
        return false; //栈空,报错 
    }
    x = S.data[S.top--]; //先出栈,指针再减1
    return true; 
} 
​
//读取栈顶元素
bool GetTop(SqStack S,int &x)
{
    if(S.top==-1)
    {
        return false;//栈空,报错 
    }
    x = S.data[S.top]; //x记录栈顶元素,x就是栈顶元素 
    return true; 
} 
​
int main()
{
    return 0;
}

六.另一种设计方式,针对top指针:top指针指向栈顶元素下一个可以插入元素的位置

针对top指针,还有另一种设计方式,可以一开始就让top指针指向0,因此判断栈是否为空只需要判断top是否为0即可:

这种方式top指针指向下一个可以插入元素的位置,因此接下来有数据元素入栈的话,举例如下:

此时如果让一个新的数据元素x入栈时,需要先把x放入top指针指向的位置(此时top指针指向下一个可以插入元素的位置),再让top指针加一:

此时如果让栈顶元素x出栈时,需要先让top指针减一(此时top指针指向下一个可以插入元素的位置),再把top指向的数据元素传回去:

顺序栈的缺点可以通过 链式存储的方式来实现栈或者可以在刚开始的时候给栈分配一个比较大的连续的存储空间(但刚开始分配大的存储空间会导致内存资源的浪费)或者共享栈来提高内存空间的利用率 来解决。


七.共享栈:

如果往0号栈放入数据元素的话,那么从下往上依次递增;

如果往1号栈放入数据元素的话,那么从上往下依次递减。

逻辑上用了两个栈,但物理上共享着同一片存储空间,这就会提高内存资源的利用率:

共享栈也会被存满,当top0+1 == top1时共享栈就满了:


八.总结:



http://www.kler.cn/news/311698.html

相关文章:

  • 3.数据类型
  • 算法打卡 Day41(动态规划)-理论基础 + 斐波那契数 + 爬楼梯 + 使用最小花费爬楼梯
  • python脚本转mac app+app签名公正
  • 开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响
  • python 实现armstrong numbers阿姆斯壮数算法
  • 利用pandas为海量数据添加UUID并实现精准筛选
  • 开放标准如何破解企业数字化与可持续发展的困境:The Open Group引领生态系统架构创新
  • 新电脑工作流搭建记录-前端篇
  • 《ElementUI/Plus 基础知识》el-table + sortablejs 实现 row 拖动改变顺序(Vue2/3适用)
  • C++对C的扩充
  • 二百六十六、Hive——Hive的DWD层数据清洗、清洗记录、数据修复、数据补全
  • ros跨平台订阅和发布消息(ip如何设置)
  • Springboot的三层架构
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • HTML基础和常用标签
  • 【C++笔记】八、结构体 [ 3 ]
  • 如何着手创建企业数据目录?(一)数据目录的设定
  • python 实现area under curve曲线下面积算法
  • libserailport交叉编译适配说明
  • 胤娲科技:解锁AI奥秘——产品经理的智能进化之旅
  • 【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!
  • C语言中的一些小知识(二)
  • Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
  • 算法题总结(三)——滑动窗口
  • MySql的基础讲解
  • Fisco Bcos 2.11.0配置console控制台2.10.0及部署调用智能合约
  • SpringAI-基于java大模型的胡言乱语
  • 正则表达式获取某些字段
  • docker快速搭建kafka
  • 【C++ Primer Plus习题】16.9