首页 > 其他分享 >让你一次了解透彻栈

让你一次了解透彻栈

时间:2024-04-04 21:33:42浏览次数:20  
标签:一次 return SqStack int top 了解 透彻 printf data

栈的定义

栈(stack)是只允许在一端进行插入或删除操作的线性表,区别于前面顺序表和链表不能从中间位置进行操作,具有严格的“专一性”,认准哪一端则只能在该端进行操作。

可以理解为栈是限定仅在表尾进行插入和删除操作的线性表

栈的特点:先进后出、后进先出

栈的示意图:

 关于栈的名词:

  • 栈顶Top:允许进行插入和进行删除操作的一段成为栈顶
  • 栈底Bottom:表的另一端称为栈底 (第一个元素进入的位置
  • 压栈(入栈、进栈)Push:在栈顶位置插入元素的操作叫做压栈,或入栈、进栈
  • 出栈(弹栈、退栈)Pop:删除栈顶元素的操作叫做出栈,也叫作弹栈,或者退栈
  • 空栈Empty Stack:不含元素的空表

栈的基本操作

以下操作皆是以顺序栈来进行操作。

首先创建一个结构体。

#define MaxSize 100         //定义栈中元素的最大个数

typedef struct SqStack {
    int data[MaxSize];     //存放栈中的元素
    int top;               //栈顶指针
} SqStack;

1.初始化

由于栈的Top值是非负整数,所以我们设置Top值负整数即可表示栈的初始化。

//初始化
void InitStack(SqStack *S) {
    S->top = -1;
}

2.判空操作

//判栈空
bool Empty(SqStack S) {
    if (S.top == -1) {
        return true;
    } else {
        return false;
    }
}

3.进栈操作

由于初始设置S->top = -1;,故栈顶指针先加一,再入栈。

这里一定先是Top进行加一操作,使Top变成合法的。

//入栈
void Push(SqStack *S, int x) {
    if (S->top == MaxSize - 1) {
        printf("当前栈满!");
        return;
    }
    S->top = S->top + 1;
    S->data[S->top] = x;
    /*
     * 可以也可以写成
     * S->data[++S->top] = x;
     */
}

4.出栈操作

  先出栈,指针再减一。

//出栈
void Pop(SqStack *S, int *x) {
    if (S->top == -1) {
        printf("当前栈为空!");
        return;
    }
    x = (int *) S->data[S->top--];
}

5.读取栈顶元素

//读栈顶元素
int GetTop(SqStack S) {
    if (S.top == -1) {
        printf("当前栈为空!");
        return -1;
    } else {
        return S.data[S.top];
    }
}

6.遍历栈

//遍历栈
void PrintStack(SqStack S) {
    //只要S.top != -1则说明栈中还存在其他元素
    while (S.top != -1) {
        printf("%d ", S.data[S.top--]);
    }
    printf("\n");
}

7.销毁栈

这里销毁栈只用将top值改为-1即可

有人可能会说为什么这里销毁之后不需要释放内存咧?

因为这里是使用静态数组进行存储相关数据,而静态分配的内存在栈里,每进入一个函数时都会建栈,栈里会存放函数用到的参数、局部变量等信息,函数执行完以后,会出栈销毁栈,这个过程就会释放你静态分配的数组内存,这是由系统自动完成的。

动态分配的内存,实际在堆上,系统没法自动帮你去释放堆上的内存,需要你自己写free或者delete来告诉操作系统需要帮你去释放堆上哪个位置的内存。

//销毁栈
void DestroyStack(SqStack *S) {
    S->top = -1;
}

完整代码: 

#include<stdio.h>
#include<stdbool.h>

#define MaxSize 100 //定义栈中元素的最大个数

typedef struct SqStack {
    int data[MaxSize]; //存放栈中的元素
    int top; //栈顶指针
} SqStack;

//初始化
void InitStack(SqStack *S) {
    S->top = -1;
}

//判栈空
bool Empty(SqStack S) {
    if (S.top == -1) {
        return true;
    } else {
        return false;
    }
}

//入栈
void Push(SqStack *S, int x) {
    if (S->top == MaxSize - 1) {
        printf("当前栈满!");
        return;
    }
    S->top = S->top + 1;
    S->data[S->top] = x;
    /*
     * 可以也可以写成
     * S->data[++S->top] = x;
     */
}

//出栈
void Pop(SqStack *S, int *x) {
    if (S->top == -1) {
        printf("当前栈为空!");
        return;
    }
    *x = S->data[S->top--];

}

//读栈顶元素
int GetTop(SqStack S) {
    if (S.top == -1) {
        printf("当前栈为空!");
        return -1;
    } else {
        return S.data[S.top];
    }
}

//遍历栈
void PrintStack(SqStack S) {
    while (S.top != -1) {
        printf("%d ", S.data[S.top--]);
    }
    printf("\n");
}

//销毁栈
void DestroyStack(SqStack *S) {
    S->top = -1;
}

int main() {
    SqStack s;
    SqStack *S;
    S = &s;
    InitStack(S);
    Push(S, 1);//入栈
    Push(S, 2);
    Push(S, 3);
    Push(S, 4);
    printf("栈顶元素为:%d\n", GetTop(*S));
    printf("出栈顺序为:");
    PrintStack(*S);
    int x;
    Pop(S, &x);
    printf("%d出栈\n", x);
    printf("栈中剩余元素:");
    PrintStack(*S);
    Pop(S, &x);
    printf("%d出栈\n", x);
    printf("栈中剩余元素:");
    PrintStack(*S);
    if (!Empty(*S)) {
        printf("当前栈不为空!");
    } else {
        printf("当前栈为空!");
    }
    return 0;
}

运行结果:

 

相信看到这里,你应该学会了栈的相关知识,如果还有什么问题欢迎留言~

标签:一次,return,SqStack,int,top,了解,透彻,printf,data
From: https://blog.csdn.net/Wanghh520max/article/details/137378587

相关文章

  • 记录一次Windows11本地部署Qwen1.5-0.5B AWQ模型的经历
    直接上代码,来自魔搭的模型通义千问1.5-0.5B-Chat-AWQ·模型库(modelscope.cn)frommodelscopeimportAutoModelForCausalLM,AutoTokenizerdevice="cuda"#thedevicetoloadthemodelontomodel=AutoModelForCausalLM.from_pretrained("qwen/Qwen1.5-0.5B-C......
  • [ERROR] [Entrypoint]: Unable to start server 记录一次-docker-运行mysql-报错
    环境说明linux系统版本:lsb_release-a  docker版本:docker-v 不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。  mysql版本:5.7  .1.问题复现。使用命令启动mysql服务 dockerrun--name=mysql-it\-p3306:3308\-eMYSQL......
  • Java后端对 前端的学习了解 ,基础知识和各框架功能发展概述,以及了解前后端的分离史
    前端的框架太多,杂乱,后端只需要掌握简单的即可 (基础的和vue框架后面详细有笔记)一.前端三要素1.HTML(结构):超文本标记语言,决定网页的结构和内容(最基础)2.CSS(表现) :层叠样式表,设定页面的修饰,相当于化妆品3.JavaScript(行为):是一种弱类型的脚本语言,源代......
  • Java后端新手的第一次面试复盘
    昨天经历了第一次Java后端实习生面试,在无数次的简历投递后,很难得的一次面试机会,收获很多,也深刻感受到自己能力的不足(还需要继续沉淀半个学期),在此记录下收获和感悟,如有错误,欢迎指正!1.面试流程闲聊(5分钟):自我介绍+询问背景动机技术问答(45分钟):包括Java基础、数据库技......
  • 记一次nginx服务异常-无法访问问题排查
    上一秒还好好地,突然下一秒nginx服务器就访问不了啦。这让人很是疑惑,到底是什么原因导致的呢?问题如下  开始一步一步地排查问题。尝试一:在windows电脑上使用telnet命令查看端口是否正常联通。测试结果发现可以正确联通。  说明端口是打开的,并且可以正确联通。 ......
  • 从基础到高级,带你深入了解和使用curl命令(一)
    前言在网络通信和数据传输中,curl命令是一个功能强大且广泛使用的工具。它可以与各种协议进行通信,如HTTP、HTTPS、FTP等,并支持各种操作,如下载文件、发送请求、测试API等。本文将从基础开始,介绍curl命令的基本用法,然后深入探讨其高级功能和实用技巧。curl简介curl是常用的命令......
  • 从基础到高级,带你深入了解和使用curl命令(二)
    前言之前我们介绍了curl命令的请求网络,设置代理等操作,本文我们继续来介绍curl命令的操作,本文我们将会介绍curl命令中有关cookie的操作。获取cookie要获取服务器发送的Cookie,可以使用curl命令的-c选项,将Cookie保存到文件中。例如:curl-ccookiec.txthttp://www.baidu.com......
  • 提升办公效率,一起了解流程自定义表单优势
    提高办公效率,可以一起了解低代码技术平台。对于很多中小型企业而言,低代码技术平台及流程自定义表单优势突出,是助力企业实现流程化办公,实现数字化转型的得力助手。流辰信息是专业研发开发平台、数据治理、数据分析等产品的服务商,是众多客户理想的合作伙伴。一起来了解低代码技术平......
  • PLSQL涉及对象类型能力域的一次代码改造案例
    文章概述本文通过某项目一次针对对象类型中一些不支持的功能项进行代码改造为契机,重新回顾和熟悉了对象类型继承,子父对象转换,函数重载等概念和应用,包括集合类型的一些编码应用场景。通过这个案例可以快速帮助我们熟悉和深刻对PSLQL对象类型和集合类型能力域的掌握。一,问题背景......
  • 了解进程
    了解进程1.什么是进程进程是一个跑起来的应用程序员进程也是操作系统分配资源的基本单位 2.如何管理进程操作系统如何管理进程?描述:使用结构体(C语言的结构体)来描述进程属性,操作系统基本上都是C/C++来写的。用来描述进程的这个结构体叫做PCB(进程控制块)......