栈Stack

C++ 栈 stack 用法简述 栈的原理比较简单易懂,而且相关的资料博客很多。在这里,就不过多详细介绍栈。本篇文章主要简述栈的基本原理和实现,便于学习和查阅。 栈的原理简述 栈仅允许在一端进行插入(push)和删除(pop)运算。这一端被称为栈顶,相对地,把另一端称为栈底。 插入:向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 删除:从一个栈删除元素又称作出栈或退栈, 阅读详情

一 栈:先进后出

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

         Stack<Integer> stack=new Stack<>();

导包 import java.util.Stack;

 public static void main(String[] args) {
        Stack<Integer> stack=new Stack<>();
        //入栈push
        stack.push(12);
        stack.push(23);
        stack.push(34);
        //出栈pop 弹出栈顶元素
        Integer x=stack.pop();
        System.out.println(x);
        Integer y=stack.pop();
        System.out.println(y);
        //peek()获取栈顶元素不删除
        int ret=stack.peek();
        System.out.println(ret);
        if(stack.empty()){
            System.out.println("栈空");
        }else {
            System.out.println("栈不为空");
        }
        System.out.println(stack.size());
    }
}

2)栈的模拟实现 

数组模拟栈的实现

import java.util.Arrays;

public class MyStack {
    //栈的模拟实现
    private int []elem;
    private int usedSize;
    private static final int DEFAULT_CAPACITY=10;
    public MyStack(){
        this.elem= new int[DEFAULT_CAPACITY];
    }
    public void  push(int val){
      if(ifFull()){
          //扩容
          elem= Arrays.copyOf(elem ,2*elem.length);
      }
            elem[usedSize]=val;
            usedSize++;
    }
    //删除 直接--
    public  int   pop(){
       if(ifFull()){
           //栈满抛异常
           throw  new EmptyException();
       }
     int  oldValue=elem[usedSize-1];
        usedSize--;
        return oldValue;
    }
    public int peek(){
        if(ifFull()){
            throw  new EmptyException();
        }
        return elem[usedSize-1];
    }
    public boolean isEmpty(){
        if(usedSize==0){
            return  true;
        }else {
            return  false;
        }
        //retutn useSize==0;
    }


    //判断数组是否填满,满则扩容
    public boolean ifFull(){
        return usedSize==elem.length;
    }

}

定义异常

public class EmptyException  extends  RuntimeException{
    //定义异常

    public EmptyException() {
    }

    public EmptyException(String message) {
        super(message);
    }
}

 例题1:逆序打印链表(反转链表)

        把链表存放在栈中(打印出元素的值)

 public ListNode reverseList(ListNode head) {
        Stack<ListNode> stack=new Stack<>();
        if(head==null) return null;
        ListNode cur=head;

        while(cur!=null){
            stack.push(cur);
            cur=cur.next;
        }
        //返回元素的值
        while(!stack.empty()){
            System.out.println(stack.pop().val+" ");
        }
    }

void printList(Node head){
if(null != head){
printList(head.next);
System.out.print(head.val + " ");
}

 例题2 括号匹配

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack=new Stack<>();
        //左括号存储,右括号弹出来匹配
        for(int i=0;i<s.length();i++){
        char ch=s.charAt(i);
            if(ch=='('||ch=='{'||ch=='['){
                stack.push(ch);
            }else{
                if(stack.empty()){
                    return false;
                }
                //char c=stack.pop();
                //先取出来如果匹配在删除
                char c=stack.peek();
                if(c=='('&&ch==')'||c=='{'&&ch=='}'||c=='['&&ch==']')
                {
                    stack.pop();  
                    //不能直接返回还要往下匹配  
                   // return true;
                }else{
                    return false;
                }
            }
        }
        //匹配完后还有剩余
        if(!stack.empty()){
             return false;
                }
                return true;
    }
}

例题3 逆波兰表达式求值

boolean/s.equals()/parseInt()

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
          //字符串数组,每一个元素是字符串
          for( String s:tokens){
            if(!isOperation(s)){
                //数字
                stack.push(Integer.parseInt(s));
            }else{
                int nums2=stack.pop();
                int nums1=stack.pop();
                switch(s){
                    case"+":
                    int ret=nums1+nums2;
                    stack.push(ret);
                    break;
                     case"-":
                     ret=nums1-nums2;
                    stack.push(ret);
                    break;
                     case"*":
                     ret=nums1*nums2;
                    stack.push(ret);
                    break;
                     case"/":
                     ret=nums1/nums2;
                    stack.push(ret);
                    break;
                     
                }
            }
          }
        return stack.pop();
    }
    //字符串比价
    public boolean isOperation(String s){
        if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
            return true;
        }
        return false;
    }
}

问题

if(tokens[i].charAt(0) != '+' && tokens[i].charAt(0) != '-' && tokens[i].charAt(0) != '*' && tokens[i].charAt(0) != '/')不能这样写!

当尝试使用 tokens[i].charAt(i) 时,实际上是在试图访问 tokens 数组第 i 个元素所对应的字符串中的第 i 个字符。这通常是不正确的,尤其是当字符串长度小于 i 时(例如,单字符数字字符串 "1"),这会导致 StringIndexOutOfBoundsException 异常。

"-11".charAt(0) 返回的是 '-',即减号字符,而不是 -11 或者其他。

switch (expression) {
    case value1:
        // 当 expression 的值等于 value1 时执行的代码块
        break;
    case value2:
        // 当 expression 的值等于 value2 时执行的代码块
        break;
    // 可以有任意数量的 case 语句
    default:
        // 如果没有 case 匹配,则执行这里的代码块
}

用Python玩转共现分析:从NLTK到热力图可视化(附完整代码) 本文详细介绍了如何使用Python进行文本共现分析,从NLTK基础文本处理到构建共现矩阵,并实现热力图可视化。通过完整的代码示例,帮助数据分析师和开发者掌握这一揭示词语间关联网络的实用NLP技术,快速从文本中提取语义关系和主题结构。 阅读详情

相关推荐

开源多波束声呐数据集:从原始回波到AI识别的关键一步

本文探讨了开源多波束前视声呐数据集(UATD)在AI目标识别中的关键作用。通过分析原始回波数据与处理后数据的差异,揭示了开源数据集如何降低研究成本、提升实验可重复性,并加速技术迭代。文章还详细解析了UATD数据集的结构、实战应用技巧及从原始数据到AI模型的完整流程,为水下目标识别研究提供了宝贵参考。

weixin_28675839的博客 422

栈<stack>

关于STL中栈的基本知识和基础拓展

2401_88542533的博客 3086

避开命令行!在VMware vCenter 8.0图形化界面里搞定SSL证书续期全流程

本文详细介绍了在VMware vCenter 8.0图形化界面中完成SSL证书续期的全流程,包括计算机SSL证书、VMCA根证书和STS证书的管理。通过可视化操作,管理员无需使用命令行即可高效处理证书问题,确保vSphere环境的稳定运行。文章还提供了证书监控与预警配置的实用技巧,帮助用户提前规避证书过期风险。

weixin_27051161的博客 282

C# 栈Stack

入栈、出栈

2401_83210138的博客 695

工业视觉开发者的福音:用C#玩转VisionMaster算子(非方案版完整教程)

本文为工业视觉开发者提供了一份完整的C#与VisionMaster算子二次开发教程,详细介绍了环境配置、算子调用原理、性能优化技巧及实战案例。通过模板匹配和二维码识别等实例,展示了如何高效集成VisionMaster算子到现有框架中,提升工业自动化视觉检测系统的灵活性和性能。

weixin_29280657的博客 270

C# 死锁:原理、诊断与解决方案深度解析

本文深入探讨了C#中的死锁问题,详细介绍了死锁的基本概念、形成机制、常见场景、诊断方法及解决方案。死锁通常发生在多线程环境下,当多个线程因争夺资源而互相等待时,导致程序无法继续执行。文章通过代码示例展示了常见的死锁场景,如锁的嵌套、同步上下文死锁和线程池死锁,并提供了使用Visual Studio、WinDbg等工具进行死锁诊断的方法。此外,文章还提出了多种预防和解决死锁的策略,包括保持锁顺序一致性、使用锁超时机制、避免同步阻塞异步代码以及使用更高级的同步原语。通过这些方法,开发者可以有效减少死锁的发生,提

记录学习的过程 1407

C++ 栈函数stack用法

C++ Stack(栈)提供了堆栈的全部功能,换句话说就是这里面已经实现了一个先进后出的数据结构。不需要我们再去重新定义各种函数,简化开发过程。 c++ stl栈stack的头文件书写格式为: #include<stack> 实例化形式如下: stack<type> StackName; 其中成员函数如下: 1、检验堆栈是否为空 empty() 堆栈为空则返回真 形式如...

Clown_pan的博客 1万+

怎么选?一文读懂12种SPC控制图,从基础到进阶,再到Python代码实现

本文系统介绍了12种常用SPC控制图的应用场景和特点,包括计量型(Xbar-R图、Xbar-s图、I-MR图等)、计数型(P图、NP图、U图等)及进阶控制图(EWMA图、CUSUM图、多元控制图)。文章强调控制图是SPC的核心工具,能有效区分过程变异类型,实现"预防优于检测"的质量管理目标。通过数据示例和Python代码展示了各类控制图的实现方法,为质量管理人员提供了实用参考。

m0_56592100的博客 4134

Java Stack 栈 常用方法

文章目录Stack 栈简介常用方法用法讲解 Stack 栈 简介 stack 类是 Vector 类的一个子类,它实现了标准的后进先出的栈 常用方法 序号 方法 作用 1 boolean empty() 判断栈是否为空 2 Object peek() 查看栈顶部的对象,但不从堆栈中移除它 3 Object pop() 移除栈顶部的对象,并作为此函数的值返回该对象。 4 Object push(Object obj) 把元素压入栈顶部 5 int search(Object

Late_whale的博客 作者:代码搬运工老李的二师兄 2398

经典的YOLOv3和YOLOV5算法详解及代码复现

yolov3和yolov5算法详解及代码复现

hasakie的博客 770

华为OD机试 - 直捣黄龙 - 广度优先搜索BFS(Python/JS/C/C++ 新系统 200分)

从样例 1 可知:5 / 2,2 -> 输出 2 9如果按“移动步数”计算应该是 8,但题目输出是 9,说明这里的“路径长度”统计的是 路径上经过的节点数量。最短路径条数:ways[end]路径长度:dist[end] + 1。

学Java,找哪吒 125

C# 栈(Stack)

栈表示对象的简单后进先出 (LIFO) 非泛型集合。Stack 和 List 一样是一种储存容器,它遵循先进后出的原则,能够存储任意类型,但并不能获取到指定的位置,只能存入和取出,取出元素后,Stack 内部的元素自动删除。

熊思雨的博客 7205

android 蓝牙通讯demo

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

Stack栈

栈是有序的数据结构,采用的是先进后出(FILO、First In Last Out)存储模式,在栈结构中分为栈顶与栈底,开发者只可以进行栈顶操作,而不允许进行栈底操作,在栈中有两类核心操作:入栈、出栈 Stack类的常用方法 范例:栈操作 package com.lxh.eighteenchapter; import java.util.Stack; public class avaCollectionDemo508 { public static void main(Strin

ll_j_21的博客 206

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java栈 Stack

Stack 栈(Stack)是一种后进先出(LIFO:Last In First Out)的数据结构。 什么是LIFO呢?我们先回顾一下Queue的特点FIFO: 所谓FIFO,是最先进队列的元素一定最早出队列,而LIFO是最后进Stack的元素一定最早出Stack。如何做到这一点呢?只需要把队列的一端封死: 因此,Stack是这样一种数据结构:只能不断地往Stack中压入(push)元素,最后进去的必须最早弹出(pop)来: Stack只有入栈和出栈的操作: 把元素压栈:push(E); 把栈顶的

赵彦军 635

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++数据结构之:栈Stack

it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。此系列专注讲解数据结构数组、链表、队列、栈、树、哈希表、图,通过介绍概念以及提及一些可能适用的场景,并以C++代码简易实现,多方面认识数据结构,最后为避免重复造轮子会浅提对应的STL容器。本文介绍的是栈Stack。

weixin_45068267的博客 1751

Java Stack栈

前言 开发过程中经常会用到集合,在不用思考的情况下,集合我们肯定是用ArrayList,HashMap,特别点的时候会用到 HashSet。但是,这几个集合类真的是万能的么?针对不同的开发场景,我们需要怎样选择正确的集合呢?那么,这节我们就将一个特别的集合----- Stack,它有一个响亮并且我们不陌生的名字:栈! 今天涉及的知识有: Stack 原理 Stack 的使用 Stack 和 ArrayList 的区别 使用示例及结果 一.Stack 原理 首先看段源码: 作者:奔跑的佩恩

RitaAndWakaka的博客 232

栈(stack)

栈(stack)是一种特殊的线性数据结构。栈(stack)的头文件是#include<stack>。只能在一端进行插入元素和删除元素,这一端为栈顶,与之相反的一端为栈底。先入栈的元素后出栈,后入栈的元素先出栈。 可以把栈想象成一个弹夹,先押入的子弹在最下面,后压入的子弹在最上面。枪支射击子弹的时候,最上面的子弹最先被射出,最下面的子弹最后被射出。

HMBBLOVEPDX的博客 1165

栈与stack

虽然栈的方法不是很多,但是栈这种独特的思想在编程题目中有着不少的应用,大家可以找两个感受感受~到这里我的分享就先结束了~,希望对你有帮助我是dylan 下次见~无限进步。

2402_89003542的博客 1092

栈stack

栈stack Stack基本概念Stack的常用操作 Stack基本概念 栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 获取栈的大小 #ifndef _MY_STACK_H_ #define _MY_STACK_H_ typedef void Stack; Stack* Stack_Create(); void Stack_Destroy(Stac

weixin_46708000的博客 157

C++ stack(栈)

C++ stack(栈)原理和方法总结

qq_44955826的博客 690

详解栈Stack

栈是限定仅在表尾进行插入或删除操作得线性表。从数据结构来看,栈也是一种线性结构。但由于其操作只能在表尾完成,因此是操作受限的线性表,也可称为限定性的数据结构。 栈的逻辑定义决定了栈具备了后进先出(last in first out,FILO)的明显特征,基于该特征,栈在计算机世界中有很多应用场景。 符号匹配 中缀表达式转换为后缀表达式 计算后缀表达式 实现函数的嵌套调用 HTML 和 XML 文件中的标签匹配 网页浏览器中已访问页面的历史记录 Java 中的程序计数栈、堆栈 word的撤销操作 栈的操作

TylerGuoj的博客 383

c++中栈stack的使用

STL 中的 stack 是一种容器适配器,而不是一种容器。容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。 stack容器适配器中的数据是以 LIFO(后进先出) 的方式组织的,通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。 查看栈的原理请看这篇博客,栈的定义和算法的实现 一、c++ stack的成员方法 使用stack需要加如下对应的头文件

进击的Explorer 1205

栈(Stack)详解

本文主要介绍了Java集合框架中栈Stack的相关知识点,包括栈的基本操作和实现细节、自定义栈、栈的应用场景、Stack类等内容。

专注Java和MySQL领域知识分享 1737

栈和stack

摘要:本文介绍了栈的基本概念和操作实现。栈是一种后进先出(LIFO)的线性表,只能在栈顶进行插入(push)和删除(pop)操作。文章详细讲解了栈的模拟实现方法,包括创建数组作为栈结构、记录栈顶位置的变量n,以及push、pop、top等基本操作的实现。同时提供了使用C++标准库stack的示例代码,并给出了两道栈相关的编程题(验证栈操作序列和栈序列)的解题思路和代码实现。最后提到后续将介绍队列(queue)的内容。

2401_88869769的博客 531

C++栈Stack基本用法

C++栈Stack基本用法常用函数函数例子 头文件:#include “stack” 定义:stack st 特性:栈中对元素的操作局限于栈顶元素(出栈、入栈) 常用函数 st.push(); //入栈 st.pop(); //栈顶元素出栈 st.top(); //获得栈顶元素 st.empty(); //判断栈空 st.size(); //栈元素数量 函数例子 stack<int> st; //empty() if(st.empty()) cout<<"空"

weixin_46562430的博客 410

栈Stack用法

** java的Stack类 ** 栈是Vector的子类,实现了一个标准的先进后出的栈 栈只定义了默认的构造函数,用来创建一个空栈。除了Vector定义的方法,也自己定了一些方法 //创建一个空栈 Stack() //测试栈是否为空 boolean empty() //查看栈顶部的对象,但不从栈中移除它 Object peek( ) //移除栈顶部的对象,并作为此函数的值返回该对象 Object pop( ) //把项压入栈顶部 Object push(Object element)

JAVA_WZZ的博客 247
上一篇: 功能测试黑盒测试方法
下一篇: 队列Queue
奈葵
博客等级 码龄4年 245粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值