栈(顺序栈)实现Language C

###王道考研的学习领悟,个人喜好讲解清晰

何为栈?

定义:栈(stack)是只允许在一端进行插入或删除的线性表。

其重要术语:栈顶,栈底,空栈。

我们只需要把这个图看明白了,理解起来就很快。

在这次的栈实现中,我们会运用到类似顺序表的定义法,举个例子:

复制代码
Elemtype *data; == Elemtype data[Maxsize];

在实际的代码操作中,指针与数组其实是等效的,指针指向一块申请的堆空间,而数组存在栈空间

所以,我们在对于顺序栈的声明时,可以看作是对顺序表的一次结构体声明。

对于每个数据结构,我们都要反问自己三要素

|------------|-----------|------------|
| 数据结构 | 顺序表 | 顺序栈 |
| 逻辑结构 | 结点相连,连续空间 | 结点相连,连续空间 |
| 物理结构 | 连续空间 | 连续空间 |
| 数据的运算/基本操作 | 可直接读取所有元素 | 只能快速读取栈顶元素 |

所以我们开始吧。

栈的定义(Stack):

一.栈的定义&初始化

cpp 复制代码
#include <stdio.h>

#define MAXSIZE 10 //这里我就定义它有10个连续空间
typedef int Elemtype;

typedef struct{
    Elemtype data[MAXSIZE]; //静态数组存放栈的元素
    int top; //栈顶指针--->一直指向栈顶

}SqStack;//声明一个栈

//初始化栈
bool InitStack(SqStack &s){
    s.top = -1; //将栈的指针设为空
    return true; 
}

补充一个小知识:如果我们使用---整型来定义数据结构的指针时,我们会使用 -1 来表示它此时指向为空,就相当于我们利用指针类型来定义的 中的NULL,空指针一样。

-2可以表示为该空间暂时空闲。 其实我们也可将 s.top = 0; 这是另一种设法,后面的操作又会需要改变一些细节。这里我们用常用的设法来进行栈的操作定义吧。

二.判断栈是否为空栈

cpp 复制代码
//判断是否为空栈, 只要指针指向的为 -1 初始定义时,就可以认为是空栈
bool IsEmpty{SqStack s)
{
    if (s.top == -1)
    {
        return true; //此时栈顶指针指向空
    }
    else
    {
        return false;
    }

}

三.栈的入栈(push)

cpp 复制代码
//栈的入栈,这里我会告诉你两种表示法,选择你喜欢的哪一个

//@操作1
bool Push1(SqStack &s,Elemtype e)
{
    if (s.top == MAXSIZE-1)
    {
        return false; //判断是否满栈了
    }
    s.top = s.top + 1; //先把指针指向下一个栈顶
    s.data[top] = e; //再把目的数值赋给当前的栈顶

    return true;

}


//@操作二  ++a 的意思是,先进行a = a + 1的操作并把结果返回给操作中

bool Push2(SqStack &s,Elemtype e)
{
    if (s.top == MAXSIZE-1)
    {
        return false; //目的与操作一相同
    }
    s.data[++s.top] = e; //相当于把 操作1中的--- 1.指针加1 2.栈顶赋值 结合在一起写
    return true;
}

入栈就是先把 栈顶指针加一位,指向没有值的栈顶,再通过数组的快速寻值【address】-

--> s.datatop = e ,将 元素e赋给当前的栈,便完成了入栈操作。

四.栈的出栈

cpp 复制代码
//栈的出栈

//也有两个出栈写法
bool Pop1(SqStack &s,Elemtype &e)
{    
    if (s.top == -1)
    {
        return false; //如果为空栈的话
    }
    //这时先把栈顶的值先拿出来
    e = s.data[s.top];
    s.top = s.top - 1;
    return true;
}

//出栈写法二   a-- 先完成该操作后 然后再进行 减1
bool Pop1(SqStack &s,Elemtype &e)
{
    if (s.top == -1)
    {
        return false; //如果为空的话
    }
    e = s.data[s.top--];
    return true;
}

五.读取栈顶元素

cpp 复制代码
//获取栈顶元素  
bool GetElem(SqStack s,Elemtype &e)
{
    if (s.top == -1)
    {
        return false; //若为空,返回错
    }
    e = s.data[s.top];
    return true;
}

六.改变栈顶的值

cpp 复制代码
//改变栈顶的值

bool ChangeNode(SqStack &s,Elemtype e)
{
    if (s.top == -1)
    {
        return false;
    }
    s.data[s.top] = e;
    return true;
}

七.读取栈里的所有值

cpp 复制代码
 //无返回值
void PrintAll(SqStack s)
{
    while( s.top != -1)
    {
        printf("%d",s.data[s.top]);
    }

}

以上就是基本的该栈的基本操作,感谢你的观看。

相关推荐
dialect_4 小时前
KMP算法
开发语言·c++·算法
总要学点什么5 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
开开心心_Every6 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c7 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌7 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
·present·7 小时前
CSAPP(Bomb lab)
c语言·c++
超级架构师8 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮8 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔9 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真9 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法