数据结构之栈(LIFO)

2024-04-08 12:20
文章标签 数据结构 之栈 lifo

本文主要是介绍数据结构之栈(LIFO),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、栈的认识:

首先,栈可以被理解为一种容器,一种类似于弹夹的一边开口一边闭口的容器,这是对栈的实际理解。

其次,栈虽然也是一种数据结构,但是它并没有固定的表现形式。总而言之,栈就是一种抽象的数据结构。或言之,他就是一种数学逻辑。

最后,其实栈是寄托于数组,链表等实体进行实现的。

下面我们将讨论栈的实现。

二、栈的实现:(有两种实现方法:数组、链表)

1)基于数组的顺序栈:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>#define MAX 101
int a[MAX] = { 0 };
int top = -1;
//插入:
void Push() {int n = 0;printf("请输入插入的数据:");scanf("%d", &n);a[++top] = n;
}
//弹出;
void Pop() {top--;printf("删除成功!");
}
//返回栈顶元素;
int Top() {if (top != -1) {return a[top];}else {printf("栈中没有元素了!");return top;}
}void print() {for (int i = 0; i <= top; i++) {printf("%d ", a[i]);}puts("");
}
int main() {//基于数组实现栈:
//准备一个数组,作为栈这个容器;Push();print();Push();print();Push();print();Pop();print();Top();print();
}

2)基于链表的线性栈:

基于链表实现栈;
基本思想:一个单链表就是一个栈,栈顶就是链表头,因此不论是push,pop都是对头操作;
其实实现的就是链表的一个头插法,头删法;
typedef struct Node {int data;struct Node* next;
}Node;
Node* top = NULL;//创建链表头指针,也就是栈顶的指针;
Node* createNode(int n) {Node* p = (Node*)malloc(sizeof(Node));p->next = NULL;p->data = n;return p;
}
void Push(int n) {Node* p = createNode(n);p->next = top;top = p;
}
void Pop() {if (top == NULL) {return;}Node* temp = top;top = top->next;free(temp);
}
int Top() {if (top == NULL) {return;}return top->data;
}
void print() {printf("栈:");Node* temp = top;while (temp != NULL) {printf("%d", temp->data);temp = temp->next;}printf("\n");
}int main(){Push(1);print();Push(2);print();Push(3);print();Push(4);print();Pop();print();printf("%d", Top());return 0;
}

对于栈的主要实现细节:

在解释前,先说明栈这种数据结构有个特点,对于元素的添加、删除、返回栈顶元素,他们的实现都需要满足时间复杂度为O(1),其实就是他们的实现与元素的数量无关。

1.基于数组,对于一个数组,怎么去对应栈的各部分呢?

数组的添加在数组尾可以达到O(1),删除可以在数组头和数组尾进行达到O(1)。但是只有一边开口,所以只有数组尾满足条件,数组尾作为栈头。

1) push()函数(不考虑栈空间不足):直接对top+1(数组尾),这样就加入了一个元素。

2) pop()函数:如果栈中有元素(top != -1),直接top-1;

3) top()函数:直接返回数组尾,top就是栈顶元素的索引.

2.基于链表,对于一个链表呢?

链表的尾插需要O(n)的时间复杂度,所以我们直接选择头插法和头删法作为Push和Pop,同时也满足在O(1)下返回栈头元素。

1) push()函数(不考虑栈空间不足):直接头插法,无任何注意事项.

2) pop()函数:直接让top向后移动一位,这里注意:最后free掉的是原本top处的内存,而不是top指向的结点,所以需要有一个临时变量 = top,free(临时变量).

3) top()函数:如果有结点,直接返回head指向处数据.

这篇关于数据结构之栈(LIFO)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885571

相关文章

【数据结构】线性表:顺序表

文章目录 1. 线性表2. 顺序表2.1 概念及结构2.2 接口实现2.3 顺序表的问题及思考 1. 线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶

Java数据结构4-链表

1. ArrayList的缺陷 由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。 2. 链表 2.1 链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素

大学生自救数据结构与算法(py实现)——01递归

目录 目录 递归 基本概念 工作原理 基本要素 优点 缺点 实现技巧 实例解析:计算阶乘 斐波那契数列 高效的斐波那契数列 python中的最大递归深度 二分查找 基本原理 性能分析 优化与变体 线性递归  元素序列的递归求和 二路递归 二路递归的基本概念 典型应用 工作原理 多重递归  示例:计算卡特兰数(Catalan Number) 尾递

数据结构和算法(1) ---- Queue 的原理和实现

Queue 的定义和结构 队列(Queue) 是只允许在一端进行插入,在另一端进行删除的线性表 队列是一种先进先出(First In First Out)的线性表,简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头 队列的基本结构如下图所示: Queue 的抽象数据类型 队列也有线性表的各种操作,不同的是插入元素只能在队列尾,删除

从零开始学数据结构系列之第三章《平衡二叉树基础概念》

文章目录 前言什么是平衡二叉树往期回顾 前言 ​   在前面的学习过程中,我们了解到二叉排序树可以在一定程度上提高查找(搜索)的效率,但仍然会出现特殊情况,让二叉排序树失效。例如,将序列{1,2,3,4,5,6}中的元素依次插入到二叉排序树中,会得到右斜树,这就相当于一个单链表了,搜索效率降低为O(n)。   于是在 1962 年,一个姓 AV 的大佬(G. M. Ade