算法模版:模拟数据结构之栈

简介: 算法模版:模拟数据结构之栈

前言


唤我沈七就好啦。

这是模拟数据结构系列。

以下是之前同系列文章。


模拟数据结构之绪论

模拟数据结构之链表


本次讲解的是栈。


什么是栈?


相关概念

栈顶:允许元素插入与删除的一端称为栈顶。

入栈:栈的插入操作。

出栈:栈的删除操作。


特点:先进后出。

即先入栈的元素需要等后入栈的元素出栈后才能出栈。

这是因为栈只有一个出口,可以通过下图来辅助理解。

栈也是线性表的一种,所以也可以理解为只能在一端操作的数组。


7.png


实现思路


前面提到,栈可以理解为只能在一端操作的数组。而这正是我们实现思路。


实现方法


1 .创建变量


const int N=1e6+10;
int stk[N],top=-1;  初始化


定义一个数组,一个放在栈顶的变量

将栈顶变量初始化为 -1 是为了方便最后判断栈是否为空。


2 . 插入操作


if(a=="push")
    {
        cin>>x;
        stk[++top]=x; 只能在栈顶插入
    }


当输入 push 5 时 ,5这个元素就入栈了。

注意这里一定要是 ++top 让下标是0, 因为 top 初始化的是 -1。

如果 top++ 下标就是 - 1 了。


3 .删除操作


else if(a=="pop")
        top--;  只能在栈顶弹出


当输入 pop 5 时 ,5这个元素就出栈了。

注意这里确实并没有真正删除放在栈顶的元素,但栈顶下降了一位,就可以理解为删除了上一位。

因为等下一次 stk[++top]=x;之前没被删除的元素就会被新插入的元素覆盖。

这里也不需要考虑空间浪费问题。


4 .判断栈空

   

if(a=="empty")
        {
        if(top==-1) // 如果栈顶还为 -1 栈就为空
        puts("YES");
        else
        puts("NO");
        }
    }
    return 0;
}


当输入 empty 时 ,返回 YES 栈就为空 , 返回 NO 栈就非空。


完整模板

# include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int stk[N],top=-1;//初始化
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        string a;
        cin>>a;
        if(a=="push")
        {
            cin>>x;
            stk[++top]=x;//只能在栈顶插入
        }  
        else if(a=="pop")
        top--;//只能在栈顶弹出
        else if(a=="empty")
        {
        if(top==-1)
        puts("YES");
        else
        puts("NO");
        }
        else 
        cout<<stk[top]<<endl;//取出栈顶
    }
    return 0;
}


完结散花


ok以上就是对模拟数据结构之栈的全部讲解啦,很感谢你能看到这儿啦。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。


参考文章


https://www.acwing.com/


相关文章
|
2月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
169 15
|
2月前
|
分布式计算 并行计算 算法
《数据之美》:图结构的精妙世界与算法实践
图是表示多对多关系的非线性数据结构,由顶点和边组成,可建模社交网络、路径导航等复杂系统。核心算法包括BFS/DFS遍历、Dijkstra最短路径、Floyd-Warshall全源最短路径,以及Prim和Kruskal最小生成树算法,广泛应用于推荐系统、社交分析与路径规划。
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
265 3
|
3月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
142 3
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
312 59
|
6月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
142 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
11月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
560 77
|
10月前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
265 11
|
11月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
463 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

热门文章

最新文章