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

数据结构——栈

时间:2025-01-20 15:57:18浏览次数:3  
标签:空栈 void 元素 Stack printf 数据结构 top

1、栈的概念

(1)是一种特殊的线性表,只能在一端进行插入或删除操作
(2)逻辑结构:线性结构;存储结构:既可以是顺序存储,也可以是链式存储
(3)栈顶:允许插入或删除的一端
(4)栈底:不允许插入或删除的一端,位置固定不变
(5)空栈:栈中没有元素
(6)使用特点:LIFO(后进先出)

2、操作

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>

#define STACK_MAX_COUNT  20

//大小:栈中元素的个数
//常用操作:创建、销毁(清0)、压栈(进栈)、弹栈(出栈)、判断空、遍历栈
//创建方式:顺序存储->顺序栈(数组创建、指针创建),链式存储->链栈

//如果操作要修改结构体变量,并使其有效,传地址;否则,传值

//顺序栈   数组创建方式
typedef int elementType;
typedef struct Stack_List {
    elementType data[STACK_MAX_COUNT];  //存储栈的元素
    int botom;  //栈底元素索引
    int top;  //栈顶元素索引
}Stack;

void printf_menu();
void Init_Stack(Stack* s);
int is_empty(Stack s);
void push_Stack(Stack* s, elementType val);
void pop_Stack(Stack* s);
void ptint_Stack(Stack s);
void clear_Stack(Stack* s);

int main() {
    printf_menu();
    Stack s;  //定义栈变量
    int order = 0;
    int flage = 0;
    elementType val;
    while (1) {
        printf("请输入操作指令:");
        scanf(" %d", &order);
        switch(order) {
            case 0:  //初始化栈
                Init_Stack(&s);
                break;
            case 1:  //判断栈是否为空
                flage = is_empty(s);
                flage ? printf("空栈!\n") : printf("不是空栈!\n");
                break;
            case 2:  //进栈(压栈)
                printf("请输入要压栈的元素:");
                scanf(" %d", &val);
                push_Stack(&s, val);
                break;
            case 3:  //出栈(弹栈),弹出栈顶元素
                  //思路:把栈顶元素删除,并打印出来即可
                pop_Stack(&s);
                break;
            case 4:  //遍历栈
                ptint_Stack(s);
                break;
            case 5:  //清栈
                  //逻辑:不改变栈顶和栈底元素的位置,只是栈中元素全部置0
                clear_Stack(&s);
                break;
            case 6:  //退出
                return;
            default:
                printf("输入错误!\n");
        }
    }
    return 0;
}

void printf_menu() {
    printf("操作指令如下:\n");
    printf("0----初始化栈\n");
    printf("1----判断栈是否为空\n");
    printf("2----进栈(压栈)\n");
    printf("3----出栈(弹栈)弹出栈顶元素\n");
    printf("4----遍历栈\n");
    printf("5----清栈,将栈中元素全部置0\n");
    printf("6---退出\n");
    printf("**************************************\n");
}

//初始化栈——空栈
//特点:top==-1  botom==-1
void Init_Stack(Stack* s) {
    assert(s);
    //将栈顶和栈底指针均置为-1,此时表示为一个空栈
    s->botom = -1; 
    s->top = -1;
    printf("初始化成功!\n");
}

//判断栈是否为空
int is_empty(Stack s) {
    //if (s.top == -1) {  //空栈
    //    return 1;
    //}else {
    //    return 0;
    //}

    //优化
    return s.top == -1;
}

//进栈(压栈)
void push_Stack(Stack* s, elementType val) {
    //栈是否满
    if (s->top >= STACK_MAX_COUNT - 1) {
        printf("栈已满,无法压栈!\n");
        return;
    }
    //压栈之前,栈是否空
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        s->botom = 0;
    }
    s->top++;
    s->data[s->top] = val;
    printf("压栈成功!\n");
}

//出栈(弹栈),弹出栈顶元素
void pop_Stack(Stack* s) {
    //判断是否是空栈
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    //弹栈之前,判断栈内是否只有一个元素
    elementType topele = s->data[s->top];  //先把栈顶元素保存
    if (s->top == 0) {  //栈内只有一个元素
        s->botom = -1;
    }
    s->top--;
    printf("弹出的栈顶元素为:%d\n", topele);
}

//遍历栈
void ptint_Stack(Stack s) {
    //判断是否是空栈
    if (s.top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    for (int i = s.botom;i <= s.top;i++) {
        printf("%d ", s.data[i]);
    }
    printf("\n");
}

//清栈
//逻辑:不改变栈顶和栈底元素的位置,只是栈中元素全部置0
void clear_Stack(Stack* s) {
    //判断是否是空栈
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    for (int i = s->botom;i <= s->top;i++) {
        s->data[i] = 0;
    }
    printf("清栈成功!\n");
}

标签:空栈,void,元素,Stack,printf,数据结构,top
From: https://blog.csdn.net/2301_81699298/article/details/145264194

相关文章

  • 2024网安数据结构恐龙提纲
    2024网安数据结构......
  • NOIP 冲刺之——数据结构
    \(\texttt{0x00}\)前言本篇文章主要记录笔者NOIP冲刺阶段复习的各种数据结构题型及tricksanstips,同时也用于及时复习与巩固。那么,开始吧。\(\texttt{0x01}\)树状数组、线段树知识点\(1\):二维偏序众所周知,逆序对可以用归并排序离线求,但是要求在线呢?这时候我们会想到......
  • 扬帆数据结构算法之雅舟航程,漫步C++幽谷——链表分类探析与双链表之定义与构筑
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数3.双链表的打印以及节点的申请打印函数节点的申请4.双链表的头插和尾插头插函数尾插函数5.双链表的查找和......
  • 数据结构与算法之栈: LeetCode 71. 简化路径 (Ts版)
    简化路径https://leetcode.cn/problems/simplify-path/description/描述给你一个字符串path,表示指向某一文件或目录的Unix风格绝对路径(以‘/’开头),请你将其转化为更加简洁的规范路径在Unix风格的文件系统中规则如下一个点‘.’表示当前目录本身此外,两个......
  • 数据结构期末复习
    数据结构期末复习1绪论算法的基本概念数据结构的基本概念数据抽象和抽象数据类型描述数据结构和算法算法分析的基本方法2线性表线性表的定义及基本操作线性表的顺序存储线性表的链接存储3栈和队列栈和队列的基本概念栈和队列的顺序存储结构栈和队列的链式存储结构......
  • [数据结构学习笔记16] 线性查找(Linear Search)
    查找算法是指从一个集合里比如数组,列表,树里查找我们想要的值。我们从最简单的线性查找开始。线性查找,就是遍历集合里的元素,查看是否有和我们想要查找的值相同的,有则查找成功,没有则查找失败。比如:5,8,6,9,1,7,3,2,4我们要找3,那从5开始依次往后,到了第7个(下标6),我们找到了3。如果我们要找......
  • 科普文:算法和数据结构系列【高效的字符串检索结构:字典树Trie树原理、应用及其java示例
    概叙科普文:算法和数据结构系列【算法和数据结构概叙】-CSDN博客科普文:算法和数据结构系列【非线性数据结构:树Tree和堆Heap的原理、应用、以及java实现】-CSDN博客科普文:算法和数据结构系列【树:4叉树、N叉树】_动态维护四叉树-CSDN博客科普文:算法和数据结构系列【二叉树总结......
  • 科普文:算法和数据结构系列【死磕字典树:字典树的升级版三叉树Ternary Search Tree优化
    概叙科普文:算法和数据结构系列【死磕字典树:来一个英文字母游戏】-CSDN博客科普文:算法和数据结构系列【高效的字符串检索结构:字典树Trie树原理、应用及其java示例代码解读】-CSDN博客‌原理‌:Trie树利用字符串之间的公共前缀来减少不必要的字符串比较,从而提高查询效率。每个......
  • 数据结构 Trick 之:平衡树有交合并
    能解决的问题类型需要将两个值域有交可重集合并的问题。优缺点无思路这个Trick基于FHQ。首先,让我们回顾一下FHQ的merge:intmerge(intl,intr){if(node[l].randd<=node[r].randd){pushdown(l);node[l].rs=merge(node[l].rs,r);......
  • [数据结构学习笔记15] 汉诺塔(Towers of Hanoi)
    汉诺塔是个古老的游戏,它可以用递归来解决。 关于汉诺塔的玩法和介绍,请参考这里。算法思想:1.目标是把最底下,最大的盘从起始柱子移到终点柱子2.那我们要先把除了最大的盘的其他盘子从起始柱子移到临时柱子上3.然后把最大的盘子从起始柱子移到终点柱子4.把除了最大盘的其......