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

}

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

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
楼台的春风3 小时前
【GPIO详解及实践示例】
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式
ll7788115 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
Jackson@ML6 小时前
Python数据可视化简介
开发语言·python·数据可视化
赵琳琅6 小时前
Java语言的云计算
开发语言·后端·golang
lly2024066 小时前
jQuery 杂项方法
开发语言
赵琳琅7 小时前
MDX语言的安全开发
开发语言·后端·golang
coding_rui7 小时前
链表(C语言版)
c语言·数据结构·链表
开开又心心的学嵌入式7 小时前
C语言——指针进阶应用
c语言·开发语言
coding_rui7 小时前
哈希表(C语言版)
c语言·数据结构·散列表