[算法]如何实现栈

实现特殊栈与队列的算法技巧 本文详细解读了实现具有特殊功能的栈和队列的数据结构方法,如设计一个具有getMin功能的栈,以及使用两个栈实现队列的示例。文中不仅提供了具体的实现代码,还探讨了不同设计方案的优缺点,以及对汉诺塔问题的递归和非递归解决方法。 阅读详情

如何实现栈


采用数组和链表两种方式来实现栈

数组实现栈,代码如下:

package 如何实现栈;

import java.util.Arrays;

public class MyStack<E> {

    private Object[] stack;
    private int size;   //数组中存储的个数
    public MyStack(){
        stack = new Object[10];   //初始长度为10
    }
    //判断堆栈是否为空
    public boolean isEmpty(){
        return size == 0;
    }

    //获取头元素
    public E peek(){
        if(isEmpty()){
            return null;
        }
        return (E) stack[size - 1];
    }

    //弹出元素
    public E pop(){
        E e = peek();
        stack[size - 1] = null;
        size--;
        return e;
    }

    //压入元素
    public E push(E item){
        ensureCapacity(size + 1);
        stack[size++] = item;
        return item;
    }

    //判断数组容器是否已满,若已满,则扩充数组空间
    private void ensureCapacity(int size){
        int len = stack.length;
        if(size > len){    //数组已满
            int newLen = 10; //每次数组扩充的容量
            stack = Arrays.copyOf(stack, newLen);
        }
    }


    public static void main(String[] args) {
        MyStack<Integer> s = new MyStack<>();
        s.push(1);
        s.push(2);
        System.out.println("栈中元素个数:"+ s.size);
        System.out.println("栈顶元素为:" + s.pop());
        System.out.println("栈顶元素为:" + s.pop());
    }
}

链表的方式实现栈,代码如下:

public class Node<E> {

    Node<E> next = null;
    E data;
    public Node(E data){
        this.data = data;
    }
}

package 如何实现栈;
/**
 * 用链表方式实现栈
 * @author dream
 *
 * @param <E>
 */
public class MyStack2<E> {

    Node<E> top = null;

    public boolean isEmpty(){
        return top == null;
    }

    public void push(E data){
        Node<E> newNode = new Node<E>(data);
        newNode.next = top;
        top = newNode;
    }

    public E pop(){
        if(isEmpty()){
            return null;
        }
        E data = top.data;
        top = top.next;
        return data;
    }

    public E peek(){
        if(isEmpty()){
            return null;
        }
        return top.data;
    }
}
【WRF工具】WRF 模型输出可视化工具 plotfmt 阅读详情

相关推荐

python sci sci-hub 爬论文

sci-hub 爬虫 后续加入对于时间的排序,下载最新文献 参考: https://www.guanjihuan.com/archives/6846 https://blog.youkuaiyun.com/czh2637750821/article/details/115508922

weixin_42783619的博客 3542

【数据结构】栈的实现

【数据结构】栈如何实现

m0_59292239的博客 1288

毕设分享|基于16单片机的指纹识别电子密码锁设计

我们今天的工作生活中,很多的场合都需要身份的认证,而传统的基于标志的身份认证技术由于受到证件伪造以及密码破解等手段的威胁,逐渐表现得有些力不从心。怎样保护自己的重要文件资料,如何保证自己的隐私不被泄露?在传统的身份认证中,我们往往使用密码加密法,但是这种方法只是"防君子不防小人"。在高明的黑客眼里,由几个字符组成的密码脆弱得不堪一击。现在,科技的发展让我们有了新的选择——生物识别技术。将生物识别技术应用于笔记本、门锁等方面,可以对文件、财产起保护作用,并且可以进行身份识别。

Sen_091的博客 1020

数据结构之栈的实现

数据结构之栈的实现

Ly的博客 1283

COLMAP生成MVSNet数据集

COLMAP生成MVSNet数据集

qq_43307074的博客 5635

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 277

【数据结构】栈(Stack)的实现 -- 详解

一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。:栈的插入操作叫做进栈 / 压栈 / 入栈,。:栈的删除操作叫做出栈。。

Elena's Blog 2039

UE5 Metahuman与Blender手动绑定:ARKit面部动画实战对比

面部动画是角色动画领域的核心技术,其核心原理在于通过驱动面部骨骼或混合形状来模拟真实肌肉运动,从而赋予数字角色生命力。这项技术的价值在于极大地提升了虚拟角色的表现力与沉浸感,广泛应用于游戏开发、影视制作、虚拟现实和实时交互应用。在技术实现路径上,开发者常面临工业化集成方案与高度自定义方案的选择。本文聚焦于使用行业标准的ARKit 52个面部混合形状数据,深度对比了虚幻引擎Metahuman的工业化流程与Blender手动绑定方案在视觉保真度、工作流效率、性能开销和扩展性上的差异,为不同项目规模与技术需求的团

weixin_33901926的博客 449

栈的理解及相关算法

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

d6d4664948的博客 2261

探测器反向偏压_光探测器PN结原理

1 光探测原理在光的作用下,当光敏物质中的电子直接吸收光子的能量足以客服原子核的束缚时,电子就会从基态被激发到高能态,脱离原子核的束缚,在外电场作用下参与导电,因而产生了光电效应。(这里需要说明的是,如果光子不是直接与电子起作用而是能量被固体晶格振动吸收,引起固体的温度升高,导致固体电学性质的改变,这种情况就不是光电效应而是热电效应)。根据所用结的种类的不同,可分为PN结,PIN 结型,...

weixin_42489104的博客 2548

YOLOv26与其他目标检测算法的对比分析

本文对YOLOv26与其他主流目标检测算法进行了全面对比分析。YOLOv26在COCO数据集上达到96.0% mAP@0.5和79.0% mAP@0.5:0.95,显著优于其他YOLO系列算法,同时保持85FPS的推理速度和35MB的轻量级模型。相比两阶段算法(如Faster R-CNN),YOLOv26在速度、模型大小和内存占用方面优势明显;相比Anchor-free算法(如CenterNet),YOLOv26在速度和模型压缩方面更优。其核心创新包括动态锚框分配、自注意力机制和轻量级设计,使其成为适用于复

一键难忘的博客 993

用栈实现LRU算法

题目要求 设分配给进程5个物理块,初始物理块是空的 所要访问页面的页号顺序为4, 7, 0, 7, 1, 0, 1, 2, 1, 2, 6 利用栈实现LRU算法,在访问完页号6之后,要求显示以下内容:   被置换出去的页号是哪个   从栈顶到栈底,栈中各保存了哪些页号 在程序中定义一个数组:int visit[]={4, 7, 0, 7, 1, 0, 1,...

学习记录 4751

LFM线性调频信号的MATLAB仿真

线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。由于线性调频信号占用的频带宽度远大于信息带宽,所以也可以获得很大的系统处理增益。线性调频信号又称鸟声(Chirp)信号,因为其频谱带宽落于可听范围,则听若鸟声,所以又称Chirp扩展频谱(CSS)技术。LFM技术在雷达、声纳技术中有广泛应用,如在雷达定位技术中,它可在增大射频脉冲宽度、提高平均发射功率、加大通信距离同时又保持足够的信号频谱宽度,不降低雷达的距离分辨率。线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 902

栈的算法实现及应用

编写程序实现下列的要求: (1)编写程序,用不同的存储方法,实现栈的基本操作。 (2)判断一个表达式中的括号(仅有一种括号,小、中或大括号)是否配对。编写并实现它的算法。 (3)* 若表达式中既有小括号,又有大括号(或中括号),且允许互相嵌套,但不能交叉,写出判断这样的表达式是否合法的算法。如 2+3*(4-{5+2}*3) 为合法;2+3*(4-{5+2*3} 、2+3*(4-[...

Andrelia的博客 2432

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

实现链栈的各种基本运算的算法_栈的连接实现

栈的链接实现称为链栈,链栈可以用带头结点的单链表来实现,如下图。LS指向链表的头结点,首结点是栈顶结点,LS->next 指向栈顶结点,尾结点尾栈底结点。各结点通过链域的连接组成栈,由于每个结点空间都是动态分配产生,链栈不用预先考虑容量的大小。typedef struct node{ DataType data; struct node *next;}LkStk;//Lkstack.h栈...

weixin_39870150的博客 1514

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

栈 递归 算法应用实现

栈的顺序结构实现 栈的链式结构实现 进制转换问题-由于转换需要重复取模运算,而前面取模的结果往往在低位,后取模的结果在高位,输出按从左到右,由高位到低位,正好可以借助栈的后进先出来解决这个问题; 爬楼梯问题;爬楼梯算法实现; 每日气温问题 - 反向遍历方法实现 及 栈方式实现;去除重复字母,保持字典序最小;给定一个经过编码的字符串,返回它解码后的字符串 - 如何使用栈方式解决...

coding不死,也未曾凋零 1237

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【算法练习Day9】用栈实现队列&&用队列实现栈

今天我们完成了用栈实现队列和用队列实现栈两道题目,相关的思想需要多复习回顾。接下来,我们继续进行算法练习·。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 263

【数据结构】使用栈实现的算符优先算法

这个例子是书上P52页栈应用举例的其中一个算法 算法的简单描述 为了实现这个算法,我们需要两个栈,一个是符号栈OPTR,另一个是数据栈OPND,算符预先设定好优先级,当解析到数字的时候,将其入数据栈 当解析到运算符的时候,比较它和之前一个运算符的优先级,如果比之前的优先级高的话,先入栈,如果和之前的元素优先级一样的话,就可以将括号去掉了(因为这个时候已经算完了),如果比之前的优先级低的话,那...

haohulala的博客 7192

算法——利用两个栈实现栈排序

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。 leetcode. 思路:利用两个栈,分别实现大顶堆和小顶堆,以小顶的栈为主栈,另一个栈为辅助栈,其中小顶的栈的数据全部会大于大顶的栈的数值。当添加数据的时候,分为三种情况: 如果该数据的值小于小顶的顶值,同时大于大顶的顶值:那么直接将数据压倒小顶的栈。 如果数据大于小.

Think Different. 2109

leetcode算法232.用栈实现队列

leetcode算法232.用栈实现队列

真正的大师永远怀着一颗学徒的心 856

《算法通关村—用栈实现队列|用队列实现栈问题解析》

LeetCode232 先看题意: 请你仅使用两个栈实现先入先出队列。利用两个栈,一个栈进行出栈,一个栈进行入栈,如果出的栈为空的时候,都把入栈中的元素压入出栈,这样一个倒过来的顺序,就成了队列的先入先出FIFO。代码。

Go_ahead_forever的博客 237

【算法】【c++】两个栈实现一个队列

入队时:直接将新元素压入 inStack,保持 O(1) 时间。出队时:如果 outStack 为空,将 inStack 全部转移到 outStack,这个转移过程会将元素顺序反转,从而使得最早入队的元素出现在 outStack 栈顶;如果 outStack 非空,直接操作其栈顶。由于每个元素最多只转移一次,所以整体的均摊时间复杂度是 O(1)。这种设计利用了两个栈之间的顺序反转特性,有效地模拟了队列的 FIFO 行为,同时在实际应用中表现出了高效性。

m0_64014551的博客 1996

栈实现队列算法解析

我现在得用C语言写一个用栈实现队列的算法题。首先,我得先回忆一下队列和栈的特性。队列是先进先出(FIFO)的,而栈是后进先出(LIFO)的。所以,用栈来模拟队列的话,可能需要两个栈来配合,一个用来处理入队操作,另一个处理出队操作。那具体怎么实现呢?比如,假设有两个栈,一个输入栈s1,一个输出栈s2。当有元素入队的时候,就直接压入s1。当需要出队的时候,如果s2为空,就把s1里的所有元素依次弹出并压入s2,这样s2的栈顶元素就是队列的第一个元素,弹出即可。如果s2不为空,就直接弹出s2的栈顶。

我的博客 813

栈和队列的关键算法实现及性能分析

入栈和出栈的操作类似,在进行完这两个操作时,都是在栈顶元素上进行操作的,即后进入的元素,同时记录数据元素的长度的标示符也要跟着改变。插入操作,和栈一样,队列是一种操作受限制的线性表。(3)返回的大小写错误,在c语言中,大小写分别是两个不同的变量,大小写的不同使其蕴含的意思也完全不相同,于是在该函数的返回中返回来“ok”这个不存在的值,所以会进行报错,解决方法为将“ok”改为“OK”。实验过程中,对程序的调试基本达到了预期的效果,对于栈的实验中,由于初始定义的栈的空间较小,导致了第一次运行时发生了“溢出”。

m0_68447809的博客 1030

链栈实现括号匹配算法

算法整体思想 封装好栈的基本操作:初始化,出栈,入栈,判断栈空。用字符数组存储用户输入的括号系列,遍历数组,如果是左括号就入栈,否则就弹出栈顶元素,将弹出的元素与该括号进行判断,若匹配则扫描下一个括号,如果匹配失败,算法结束,提示失败。扫描完所有字符后,如果栈非空,说明匹配失败。 编码实现 定义栈 typedef struct LNode{ char data; struct LNode *next; }*LiStack; 初始化 void InitLiStack(LiStack &amp

qq_19272233的博客 1529

栈的定义和算法的实现

一、栈的定义 栈(stack) 是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top) ,相应地,表头端称为栈底(bottom) 。不含元素的空表称为空栈。 假设栈 S=(a1,a2,...,an)S=(a_1,a_2,...,a_n)S=(a1​,a2​,...,an​) ,则称a1a_1a1​ 为栈底元素,ana_nan​ 为栈顶元素。栈中元素按a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ 的次序进栈,退栈的第一个元素应为

进击的Explorer 2256
上一篇: [算法]判断一个链表是否有环
下一篇: [算法]求栈中最小元素
陶程
博客等级 码龄12年 360粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值