关于动态数组,参见我的上一篇关于动态数组的博文https://www.cnblogs.com/inu6/p/11717129.html

1.什么是栈?

(1)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶。

(2)栈是一种后进先出的数据结构

画个图:

2.栈的实现

(1)定义一个栈的接口

 接口是类的行为的抽象。

 以下行为分别为,(1)向栈内添加元素,(2)从栈中取出元素,(3)查看栈顶元素,(4)判断栈是否为空,(5)获取栈内元素的个数

public interface Stack<E> {

    void push (E e);

    E pop ();

    E peek ();

    boolean isEmpty ();

    int getSize();
}

(2)实现接口

实现类的成员变量和构造方法

public class ArrayStack<E> implements Stack<E> {

    private Array<E> array;
  //有容量传入的构造方法
public ArrayStack (int capacity) {
array = new Array<>(capacity);
}
  //无容量传入的构造方法
public ArrayStack () {
array = new Array<>();
}
}

实现接口定义的方法

//向栈中添加元素
public void push (E e) {
array.addLast(e);
}
//向栈中取出元素
public E pop () {
return array.removeLast();
}
//查看栈顶元素
public E peek () {
return array.getLast();
}
//判断栈是否为空
public boolean isEmpty () {
return array.isEmpty();
}
//查看栈中元素的个数
public int getSize(){
return array.getSize();
}

自定义方法

 //查看栈的容量
public int getCatacity() {
return array.getCapacity();
}

重写toString方法

@Override
public String toString () {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Stack,");
stringBuilder.append("[");
for (int i = 0; i < array.getSize(); i++) {
stringBuilder.append(array.getByIndex(i));
if (i != array.getSize() - 1) {
stringBuilder.append(',');
} }
stringBuilder.append("] top");
return stringBuilder.toString();
}

3.栈的应用

leetcode第20题 :有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

解题思路

借助栈的后进先出的特性,来解决这个对称性比对问题。

思路: 将'(' '[' '{' 装入栈中,如果遇到非这三种括号的类型,则取出栈顶元素与之比较,如果中途有不匹配的,则返回false,如果均匹配,最终栈一定是空的,返回true.

实现:(1)将字符串拆开遍历成一个个的字符型,然后进行一个If判断,如果满足,则装入栈中。

   (2)否则进去else子句中,在子句中,进行了4个判断语句;此处可以将这4个语句想象为4个监察,如果有一个不满足,那就不能继续下去;

   (3)第一个判断语句验证此时栈是否为空,如果为空,那显然是不对的,没有进行,第二,三,四个判断语句均为验证是否匹配。

   (4)如果能顺利的走到最后,那么进行最后一次验证,看栈里面是否为空,为空则返回true。此时整段代码跑完,证明传入的字符串符合规则。

解题代码:

public class Solution {
public boolean isValid(String s) {
ArrayStack<Character> arrayStack = new ArrayStack<>();
for (int i = 0; i< s.length(); i++) {
char c = s.charAt(i);
if (c == '{' || c =='[' || c =='(') {
arrayStack.push(c);
} else {
if (arrayStack.isEmpty()) {
return false;
}
       //pop()方法为取出栈顶元素,并且返回元素的值
char top = arrayStack.pop();
if (c == '}' && top != '{') {
return false;
}
if (c == ']' && top != '[') {
return false;
}
if (c == ')' && top != '(') {
return false;
}
} }
return arrayStack.isEmpty();
}
}

最后

浮于表面看千遍

不如自己练一遍

希望这篇文章对你能够起到帮助!

基于自定义的动态数组实现一个栈(Java语言)的更多相关文章

  1. 二 基于java动态数组手写栈

    package dataStucture2.stack; import dataStucture2.array.MyDynamicArray; /** * 基于动态数组手写栈 * 设计时,栈中仅栈顶对 ...

  2. C语言实现使用动态数组来构造栈结构

    我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...

  3. 算法入门 - 动态数组的实现(Java版本)

    静态数组 Java中最基本的数组大家肯定不会陌生: int[] array = new int[6]; for (int i = 0; i < array.length; i++){ array ...

  4. 有关Java动态数组的一个小问题

    前言 问题描述 今天遇到一个关于集合的问题,觉得比较有趣,记录一下,这个问题是:定义一个用户类,至少包含姓名,年龄,生日,qq邮箱,初始化10个用户,利用String操作,提取qq到List集合中,姓 ...

  5. 参考JDK1.8源码,自己写一个类似于ArrayList的动态数组

    1. ArrayList的基本实现原理 ArrayLiST其内部用一个普通数组来存储数据,当此数组不够容纳新添加的元素的时候,则创建一个更大长度的新数组,并将原来数组中的元素复制到新数组中. 2.Ar ...

  6. 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理

    通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...

  7. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  8. 如何轻松使用 C 语言实现一个栈?​

    什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...

  9. C++ Primer : 第十二章 : 动态内存之动态数组

    动态数组的分配和释放 new和数组 C++语言和标准库提供了一次分配一个对象数组的方法,定义了另一种new表达式语法.我们需要在类型名后跟一对方括号,在其中指明要分配的对象的数目. int* arr ...

随机推荐

  1. c++ 判断两圆位置关系

    对于两圆的位置一般有五种关系: (1) 外离:两圆的半径之和小于两圆圆心距离 (2) 外切:两圆的半径之和等于两圆圆心距离 (3) 相交:两圆的半径之和大于两圆圆心距离,两圆圆心距离大于两圆半径之差 ...

  2. CSP-S全国模拟赛第二场 【nan】

    A.count 本场比赛最难的题... 隔板法组合数容斥 xjb 搞搞就好了 //by Judge #include<cstdio> #include<iostream> #d ...

  3. MY SQL数据库密码最简单的一个方法()

    https://zhidao.baidu.com/question/564368111.html 非常简单的一个修改方法!!!!!!!!!!!!!!!!!!!!! 最简单的方法就是借助第三方工具Nav ...

  4. RabbitMQ几种队列模式

  5. 《CSS权威指南》双鱼书详解——第二章选择器

    一.基本规则 CSS的核心特性就是能向文档中的一组元素类型应用某些规则. 二.规则结构 选择器+声明块. h1{ color:red;background:yellow;} ,声明块由一个或多个声明组 ...

  6. 【React 8/100】 React路由

    React路由 React路由介绍 现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序.因为它的用户体验更好.对服务器压力更小,所以更受欢迎.为了有效的使用单个页面来管 ...

  7. 为啥要使用Hessian

    1.为啥要使用Hessian? 有需求就有市场,挨踢界也是一样,想要实现远程调用,Hessian就应运而生. 场景:有一个后台系统,基本上所有的用户管理都在这个系统里操作,其中有一个方法是添加用户的方 ...

  8. django基础篇01-环境的搭建和项目的创建

    本文参考自银角大王的博客 基本配置 常用命令: django-admin startproject xxx(项目名) python3 manage.py startapp xxx(app名) pyth ...

  9. mysql随机取一条记录

    function getTodayLook($limit) { $sql = "select * from `tvhome_movie_today` order by rand() limi ...

  10. 百度网盘SVIP不限速Mac破解版(亲测可用)

    百度网盘SVIP不限速Mac破解版(亲测可用),按照教程一步一步来就可以了,链接如下: https://mac.orsoon.com/Mac/166358.html?id=ODY0MDA2Jl8mMT ...