基于自定义的动态数组实现一个栈(Java语言)
关于动态数组,参见我的上一篇关于动态数组的博文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语言)的更多相关文章
- 二 基于java动态数组手写栈
package dataStucture2.stack; import dataStucture2.array.MyDynamicArray; /** * 基于动态数组手写栈 * 设计时,栈中仅栈顶对 ...
- C语言实现使用动态数组来构造栈结构
我在面前一篇博客<C语言实现使用静态数组来构造栈结构>中使用了静态数组来模拟栈的操作.静态数组的大小是在代码中写死的.是存储在用户栈上面的,使用起来不灵活.在这篇博客中我会使用动态数组来构 ...
- 算法入门 - 动态数组的实现(Java版本)
静态数组 Java中最基本的数组大家肯定不会陌生: int[] array = new int[6]; for (int i = 0; i < array.length; i++){ array ...
- 有关Java动态数组的一个小问题
前言 问题描述 今天遇到一个关于集合的问题,觉得比较有趣,记录一下,这个问题是:定义一个用户类,至少包含姓名,年龄,生日,qq邮箱,初始化10个用户,利用String操作,提取qq到List集合中,姓 ...
- 参考JDK1.8源码,自己写一个类似于ArrayList的动态数组
1. ArrayList的基本实现原理 ArrayLiST其内部用一个普通数组来存储数据,当此数组不够容纳新添加的元素的时候,则创建一个更大长度的新数组,并将原来数组中的元素复制到新数组中. 2.Ar ...
- 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理
通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...
- 基于 JDK 的动态代理机制
『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...
- 如何轻松使用 C 语言实现一个栈?
什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...
- C++ Primer : 第十二章 : 动态内存之动态数组
动态数组的分配和释放 new和数组 C++语言和标准库提供了一次分配一个对象数组的方法,定义了另一种new表达式语法.我们需要在类型名后跟一对方括号,在其中指明要分配的对象的数目. int* arr ...
随机推荐
- (ROT-13解密)Flare-On4: Challenge1 login.html
说是FlareOn的逆向 倒不如说是crypto....... 题目不难 F12看源码: document.getElementById("prompt").onclick = f ...
- tomcat启动失败的三种方法
Tomcat启动失败的解决办法 1. 重复映射 用eclipse开发时,用Eclipse开发,新建了的servlet会有一个url-pattern声明: 这样就不需要再在web.xml中添加映射,如果 ...
- MyBatis二级缓存的笔记及记录
一.什么是二级缓存: 由于一级缓存是一次性的.临时的:每个会话都会创建一个新的:多个会话之间是不能共享的: 二级缓存用于解决一级缓存的不足:每一个“namespace”都会对应一个二级缓存:执行查询的 ...
- go 关键字之 defer
我是谁 defer - 顾名思义翻译过来叫 延迟, 所以我们通常称呼 defer func() 这样 defer 后面紧跟的函数为 延迟函数. 作者注: 不过从实际应用来讲, 延迟函数通常用来做一些函 ...
- git将某个分支的代码完全覆盖另一个分支
假设每个人有个开发分支,想隔一段时间就把自己的开发分支上的代码保持和测试分支一直,则需要如下操作: 1.我想将test分支上的代码完全覆盖dev分支,首先切换到dev分支git checkout de ...
- Windows Neovim
配置文件路径C:\Users\UserName\AppData\Local\nvim\init.vim Vim-plug配置文件路径:C:\Users\UserName\AppData\Local ...
- 内置time模块和random模块
#time模块#time模块中有三种时间表达方式#时间戳(timestamp):指从1970年1月1号0:0:0开始按秒计算的时间偏移量#元组形式的结构化时间(strut_time):含有9个元素(t ...
- AT Regular 086
C - Not so Diverse 略 D - Non-decreasing 先找绝对值最大的数 构造出全正(最大的数为正) 或者全负(最大的数为负) 然后前缀和(正)或者后缀和(负) 操作次数2n ...
- Maven项目的一些依赖
Maven构建的Spring项目需要哪些依赖? <!-- Spring依赖 --> <!-- 1.Spring核心依赖 --> <dependency> <g ...
- vue项目中 指令 v-html 中使用过滤器filters功能
转载于简书 链接:http://www.jianshu.com/p/29b7eaabd1ba 问题 2.0 filters only work in mustache tags and v-bind. ...