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

}

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

相关推荐
2501_947575804 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师4 小时前
java面试题 4:鉴权
java·开发语言
时间的拾荒人5 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
2501_948106915 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
持力行6 小时前
C/C++ 中的 char*:它标识数组吗?为什么能用下标访问?
c语言·c++
取经蜗牛6 小时前
Python 第一阶段完全指南:从零到第一个实用工具
开发语言·python
dog2506 小时前
从重尾到截断流量模型的演进
开发语言·php
qq_401700416 小时前
Qt QSS 完全入门写出漂亮界面以及解决样式不生效问题
开发语言·qt
我是一颗柠檬7 小时前
【Java项目技术亮点】覆盖索引与索引下推优化
android·java·开发语言
2601_962440848 小时前
计算机毕业设计之健身房管理系统的设计与实现
java·开发语言·课程设计·旅游·宠物