栈(顺序栈)实现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]);
    }

}

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

相关推荐
Highcharts.js8 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员9 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
爱写代码的小朋友11 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华11 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.12 小时前
C++:语句和作用域
开发语言·c++
wanderist.12 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰13 小时前
PHP上传文件
android·开发语言·php
Yeauty15 小时前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频
geovindu15 小时前
CSharp: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·算法·c#·.net·搜索算法
库克克16 小时前
【C++】set 与multiset
开发语言·c++