热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构与算法基础入门——手写栈(三)

栈(stack),它是一种运算受限的线性表,后进先出(LIFO)LIFO(lastinfirstout)表示就是后进入的元素,第一个弹出

栈(stack),它是一种运算受限的线性表,后进先出(LIFO)


  1. LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘,
    往往先把拿出去使用.
  2. 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
  3. 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
  4. 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
  5. 时间复杂度:出/入栈O(1),扩容O(n)

栈的分类:

可以基于数组、单向链表实现。两者区别跟数组和链表一样。

public interface MyStack {MyStack push(Item item);Item pop();int size();boolean isEmpty();}

public class ArrayStack implements MyStack{private Item [] a;public int n &#61; 0;public ArrayStack(int cap){a &#61; (Item[]) new Object[cap];}/*** 2被扩容*/private void judgeSize(){if(n >&#61; a.length ){resize(a.length * 2);}}/*** 扩容* &#64;param size*/private void resize(int size){Item [] temp &#61; (Item[]) new Object[size];for (int i &#61; 0; i 0 && n <&#61; a.length / 2){resize( a.length / 2);}}&#64;Overridepublic MyStack push(Item item) {judgeSize();a[n&#43;&#43;] &#61; item;return null;}&#64;Overridepublic Item pop() {if(isEmpty()){return null;}Item item &#61;a[--n];a[n] &#61; null;shrink();return item;}&#64;Overridepublic int size() {return n;}&#64;Overridepublic boolean isEmpty() {return n&#61;&#61; 0;}public static void main(String[] args) {ArrayStack arrayStack &#61; new ArrayStack(4);arrayStack.push("1");arrayStack.push("2");arrayStack.push("3");arrayStack.push("4");arrayStack.push("5");System.out.println(arrayStack.size());arrayStack.pop();arrayStack.pop();arrayStack.pop();System.out.println(arrayStack.size());}
}

拓展应用&#xff1a;

1、基于栈&#xff0c;实现符号匹配&#xff1a;时间复杂度O(n)

public class KuoHaoStack {public static boolean isOk(String s){ArrayStack brackes &#61; new ArrayStack<>(50);char[] c &#61; s.toCharArray();Character top;for (char c1 : c) {switch (c1) {case &#39;{&#39;:case &#39;(&#39;:case &#39;[&#39;:brackes.push(c1);break;case &#39;}&#39;:top &#61; brackes.pop();if(top!&#61; null && top &#61;&#61; &#39;{&#39;){break;} else {return false;}case &#39;)&#39;:top &#61; brackes.pop();if(top!&#61; null && top &#61;&#61; &#39;(&#39;){break;} else {return false;}case &#39;]&#39;:top &#61; brackes.pop();if(top!&#61; null && top &#61;&#61; &#39;[&#39;){break;} else {return false;}default:break;}}return brackes.isEmpty();}public static void main(String[] args) {Scanner scanner &#61; new Scanner(System.in);while (scanner.hasNext()){System.out.println("匹配结果&#xff1a;"&#43;isOk(scanner.next()));}}
}

2、基于栈&#xff0c;实现简单的四则运算&#xff1a;
1、声明 两个栈&#xff0c;一个存数字&#xff0c;一个存运算符
2、遇到数字&#xff0c;直接入栈到数字栈里面
3、遇到符号就把符号栈的栈顶拿出来做比较&#xff0c;如果它比栈顶符号的优先级高就直接入栈。如果比符号栈顶的优先级低或者相等&#xff0c;就从符号栈顶里面取栈顶&#xff08;数字栈中取栈顶的两个数&#xff09;进行计算。计算完把新的计算术插入栈顶。举例&#xff1a;1&#43;3*4-5&#61;8
在这里插入图片描述

3、java 函数调用&#xff1a;a调a中的b方法&#xff0c;b又调b中的c 方法。最后一次返回为c->b->a。
4、浏览器的前进和后退&#xff1a;两个栈A,B 点击前进入A栈&#xff0c;点后退出A栈入B栈。点前进出B栈入A栈。


推荐阅读
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 深入解析ArrayList与LinkedList的差异
    本文详细对比了Java中ArrayList和LinkedList两种常用集合类的特性、性能及适用场景,通过代码示例进行测试,并结合实际应用场景分析其优缺点。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • 本文介绍如何在MySQL中创建一个自定义函数,用于将包含多个班级编号的字符串拆分为对应的班级名称。通过详细解释代码逻辑和功能,帮助读者理解并应用这一技术。 ... [详细]
  • 本文深入探讨了 Java 中 LocalTime 类的 isSupported() 方法,包括其功能、语法和使用示例。通过具体的代码片段,帮助读者理解如何检查特定的时间字段或单位是否被 LocalTime 类支持。 ... [详细]
  • 本文详细介绍了装饰者(Decorator)模式,这是一种动态地为对象添加职责的方法。与传统的继承方式不同,装饰者模式通过组合而非继承来实现功能扩展,从而提供更大的灵活性和可维护性。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
author-avatar
awrjftyitik
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有