关于动态数组,参见我的上一篇关于动态数组的博文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. Keil共存的方法 - Keil MDK兼容Keil C51,实操可行

    记录一下成功使Keil MDK和Keil C51共存的过程! 之前一直用Keil C51开发,最近需要用到ARM9内核的IC,就需要Keil C51和Keil MDK共存.看了一下网上几个教程,方法大 ...

  2. ESXi导出的CentOS7 ovf文件导入到workstation 无法打开GUI登录界面的问题解决方案

    1. 前几天将centos的机器导出为ovf 文件 然后使用 workstation 引入之后发现总是黑屏 然后有一个 横杠在闪 2. 解决办法是 修改centos的虚拟机配置文件,将显示器修改为这样 ...

  3. 【监控笔记】【1.1】监控事件系列——SQL Server Profiler

    声明:本系列是书目<sql server监控与诊断读书笔记> 联机丛书监控:https://docs.microsoft.com/en-us/sql/relational-database ...

  4. vue element 导出 分页数据的excel表格

    1.安装相关依赖 npm install --save xlsx file-saver 2.导入相关插件 在组建头部导入相关插件 const FileSaver = require("fil ...

  5. 短信群发(Thinkphp内核)

    public function save(){ $id = I('id'); $Goods = M('message'); $info = $Goods->find($id); //就收数据 $ ...

  6. Javascript的是三种字符串连接方式

    第一种:用连接符“+”连接字符串 str="a"; str+="b"; 这种方法相对以下两种,最便捷快速.建议100字符以下的连接使用这种连接方式. 第二种:以 ...

  7. Java 接口和多态练习

    我们鼠标和键盘实现USB接口,那么我们鼠标和键盘就变成了USB设备,这时候我们就可以把它放到笔记本电脑里面去用 package com.biggw.day10.demo07; /** * @autho ...

  8. I-最短的名字

    在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫’aaaaa’的时候可以只叫’a ...

  9. Qt读写Json

    Qt操作Json 1.QJsonDocument 1.详细说明 QJsonDocument类提供了读写JSON文档的方法. QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF ...

  10. goaccess实现nginx实现日志可视化

    一:goaccess模块 goaccess模块是将nginx的日志定向到goaccess模块里实现,原理很简单,只要将文件定向到那里就可以,goaccess是已经集成好显示数据的一个页面,非常的美观和 ...