栈(顺序栈)实现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.data[top] = 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]);
    }

}

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

相关推荐
武昌库里写JAVA4 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
ZSYP-S40 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos43 分钟前
c++------------------函数
开发语言·c++
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言