首页 > 其他分享 >数据结构-栈

数据结构-栈

时间:2025-01-21 21:28:56浏览次数:3  
标签:空栈 top 元素 ST printf 数据结构 stack

1、栈的基本概念

1、栈是特殊的线性表:只允许在一端进行插入和删除操作

2、栈的逻辑结构就是线性结构,栈的存储结构既可以是顺序存储,也可以是链式存储

3、栈顶:允许进行插入和删除的一端(最上面的为栈顶元素)

4、栈底:不允许进行插入和删除的一端(最下边的栈底元素)

5、空栈:不含任何元素的空表

6、特点:先进后出 、      LIFO(Last in First Out)

2、栈的基本操作   

创建、销毁、压栈(进栈)、弹栈(出栈)、判空、遍历

3、栈的创建

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100


//顺序栈的创建方式:利用数组  和  利用指针
//利用数组创建栈
typedef  int eleT;
typedef struct Satck {
    eleT data[MAX_SIZE];//存放栈中的元素
    int top;//存放栈顶元素的索引
    int bottom;//存放栈底元素的索引
}ST;


void Init_Stack(ST* s);
bool is_empty(ST s);
void push_stack(ST* s, eleT val);
void print_stack(ST s);
void pop_stack(ST* s);
void clear_stack(ST* s);
int main()
{

    eleT val = 0;
    ST s;  //定义栈变量


    int order = 0;
    printf("操作指令:\n");
    printf("1、初始化\n");
    printf("2、压栈\n");
    printf("3、弹栈\n");
    printf("4、遍历\n");
    printf("5、判空\n");
    printf("6、清0\n");
    while (1)
    {
        printf("请输入指令:");
        scanf("%d", &order);
        switch (order)
        {
        case 1:
            //初始化
            //1、初始化一个空栈
            Init_Stack(&s);
            break;
        case 2:
            //压栈
            printf("请输入要压栈的元素:");
            scanf("%d", &val);
            push_stack(&s, val);
            break;
        case 3:
            //弹栈  弹出栈顶元素,
            //思路逻辑:把栈顶元素删除,并打印出来即可
            pop_stack(&s);
            break;
        case 4:
            //遍历
            print_stack(s);
            break;
        case 5:
            //判空
            is_empty(s) ? printf("空栈\n") : printf("不是空栈\n");
            break;
        case 6:
            //清0  
            //清0逻辑:不改变栈顶和栈底元素位置,只是把栈内元素设置为0
            clear_stack(&s);
            break;
        case 7:
            //退出
            return;
        default:
            printf("指令有误,重新输入\n");
        }
    }
    return 0;
}

//1、初始化一个空栈  
//空栈的特点:top==-1   bottom == -1
void Init_Stack(ST* s)
{
    s->bottom = -1;
    s->top = -1;
    printf("初始化成功\n");
}

//2、压栈
void push_stack(ST* s, eleT val)
{
    //先判断栈是否已满
    if (s->top == MAX_SIZE - 1)
    {
        //栈已满
        printf("栈已满,无法压栈\n");
        return;
    }
    //再判断是不是空栈
    if (is_empty(*s))
    {//空栈
        s->bottom++;
    }
    s->top++;
    s->data[s->top] = val;//放入新元素
    printf("压栈成功\n");
}


//3、判空  判断是不是空栈   是空栈返回1(true)   不是空栈返回0(false)
bool is_empty(ST s)
{
    if (s.top == -1)
    {  //是空栈
        return true;
    }
    //不是空栈
    return false;
}

//4、栈的遍历
void print_stack(ST s)
{
    //判断是否是空栈
    if (is_empty(s))
    {
        printf("空栈\n");
        return;
    }

    for (int i = s.bottom; i <= s.top; i++)
    {
        printf("%d  ", s.data[i]);
    }
    printf("\n");
}


//弹栈
//把栈顶元素删除,并打印出来即可
void pop_stack(ST* s)
{
    //判断你是否是空栈
    if (is_empty(*s))
    {
        printf("空栈\n");
        return;
    }
    //要考虑到弹栈之前,栈内是否只有一个元素
    eleT topele = s->data[s->top];// 先把栈顶元素保存一下
    if (s->top == 0)
    {
        //说明栈内只有一个元素
        s->bottom--;
    }
    s->top--;
    printf("弹出的栈顶元素为:%d\n", topele);
}

//清0逻辑:不改变栈顶和栈底元素位置,只是把栈内元素设置为0
void clear_stack(ST* s)
{
    if (is_empty(*s))
    {
        printf("空栈\n");
        return;
    }

    for (int i = s->bottom; i <= s->top; i++)
    {
        s->data[i] = 0;
    }
    printf("清0成功\n");
}
 

标签:空栈,top,元素,ST,printf,数据结构,stack
From: https://blog.csdn.net/m0_68557555/article/details/145254054

相关文章

  • 数据结构-二叉树
     树的相关概念:1、节点的度:树中一个节点的孩子个数称为该节点的度,所有节点的度的最大值是树的度2、分支节点:度大于0的节点称为分支节点3、叶子结点:度为0的节点称为叶子结点4、节点的层次(深度):从上往下数,根节点为1层,依次往下加15、树的高度(深度):树中节点的最大层次6、树......
  • 《StringBuilder类的数据结构和扩容方式解读》
    StringBuilder类的简单用法、数据结构和扩容方式解读文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言在之前的文章中和大家讲过String字符串类具有不可变性,今天给大家介绍一个可变字符串类——StringBuilder类。提示:以下是本篇文章正文内......
  • 数据结构2——线性表的链式存储
    前言顺序存储结构的缺点:①插入、删除操作需要移动大量的元素。② 预先分配空间需按最大空间分配,利用不充分。③表容量扩充十分不方便(可能会产生效率问题)。而链式存储结构恰好弥补了顺序存储这些缺陷。1.认识线性表链式存储1.1线性表链式存储的构成①可用一组任意......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • 单调队列:实用而好写的数据结构
    前言|Preface这几天连续做了好几道单调队列的题,难度从绿到蓝不等,摸索出了一些经验,也总结了一些单调队列的特点和规律。概述|Outline顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进......
  • 数据结构与算法之递归: LeetCode 39. 组合总和 (Ts版)
    组合总和https://leetcode.cn/problems/combination-sum/description/描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合candid......
  • 01 序论(数据结构实战)
    计算机的发展与用途:早期的计算机:最初,计算机主要是用来进行数学运算,像是加减乘除这种“数值计算”。它们主要用在科学研究、工程计算等需要大量数字计算的领域。现在的计算机:现代的计算机用途广泛,已经不仅仅局限于处理数字。它们还处理许多其他类型的数据,比如文字、表格、图片......
  • 数据结构-堆及堆排序
    1.堆的定义堆(Heap)是一种数据结构,通常是一个完全二叉树。在堆中,每个节点都有一个与其相关的值,并且满足堆的性质。堆分为两种类型:大堆和小堆。大堆:在大堆中,对于每个非叶子节点,其值都大于或等于它的子节点的值。也就是说,根节点的值是整个堆中的最大值。小堆:与大堆相反,在小堆中,对......
  • 【第一天】零基础入门刷题Python-算法篇-数据结构与算法的介绍(持续更新)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Python数据结构与算法的详细介绍1.基本概念2.Python中的数据结构1.列表(List)2.元组(Tuple)3.字典(Dictionary)4.集合(Set)5.字符串(String)3.Python中的常用算法1.排序算法2.搜索算法3.递......
  • 数据结构——栈
    1、栈的概念(1)是一种特殊的线性表,只能在一端进行插入或删除操作(2)逻辑结构:线性结构;存储结构:既可以是顺序存储,也可以是链式存储(3)栈顶:允许插入或删除的一端(4)栈底:不允许插入或删除的一端,位置固定不变(5)空栈:栈中没有元素(6)使用特点:LIFO(后进先出)2、操作#define_CRT_SECURE_NO_......