首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科:

  栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

        栈的模型图


大致了解了栈这种数据结构后,我们就尝试着将其实现吧。

首先,我们需要定义一个Stack接口,代码如下:

public interface Stack<E> {
int getSize();//得到栈的大小
boolean isEmpty();//判断栈是否为空
void push(E e);//压栈
E pop();//出栈
E peek();//查看栈顶元素
}

由于在<数据结构系列1>(https://www.cnblogs.com/LASloner/p/10721407.html)中我们已经实现了ArrayList,所以今天我们就用Array来作为Stack的数据存储方式吧:

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

    //这里用的是自己实现的Array,当然读者可以直接用Java自带的ArrayList,效果相同
private Array<E> array; //有参构造
public ArrayStack(int capacity){
array=new Array<E>(capacity);
}
//无参构造
public ArrayStack() {
array=new Array<E>();
} //获取栈的大小
@Override
public int getSize() {
return array.getSize();
} //判断栈是否为空
@Override
public boolean isEmpty() {
return array.isEmpty();
} //压栈(向栈顶添加元素)
@Override
public void push(E e) {
array.addLast(e);
} //出栈(取出栈顶元素)
@Override
public E pop() {
return array.removeLast();
} //查看栈顶元素
@Override
public E peek() {
return array.get(array.getSize()-1);
} @Override
public String toString() {
StringBuilder res=new StringBuilder();
res.append("Stack: ");
res.append('[');
for (int i=0;i<array.getSize();i++) {
res.append(array.get(i));
if(array.getSize()-1!=i)
res.append(", ");
}
res.append("] top");
return res.toString();
}
}

当当,这就实现了栈的结构,其实也没那么复杂嘛(当然实现栈的数据存储方式还有很多,不仅仅是数组,还有链表,在我们学习过链表后,就尝试用链表也实现一下)

okey,让我们测试一下

Main代码:

public class Main {
public static void main(String[] args) { ArrayStack<Integer> stack = new ArrayStack<>(); for(int i = 0 ; i < 5 ; i ++){
stack.push(i);
System.out.println("入栈:"+stack);
}
System.out.println("--------------------------"); stack.pop();
System.out.println("出栈:"+stack);
System.out.println("--------------------------"); System.out.println("查看栈顶元素:"+stack.peek());
System.out.println(stack);
}
}

输出如下:

入栈:Stack: [0] top
入栈:Stack: [0, 1] top
入栈:Stack: [0, 1, 2] top
入栈:Stack: [0, 1, 2, 3] top
入栈:Stack: [0, 1, 2, 3, 4] top
--------------------------
出栈:Stack: [0, 1, 2, 3] top
--------------------------
查看栈顶元素:3
Stack: [0, 1, 2, 3] top

那老规矩,再看一下栈中各种操作的时间复杂度吧:

ArrayStack<E>:
void push(E) O(1)
E pop() O(1)
E peek() O(1)
int getSize() O(1)
boolean isEmpty O(1)

最后用一个实例来应用一下 栈 这种数据结构吧:

  /*有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
*/
public class Solution {
public boolean isValid(String s) {
ArrayStack<Character> stack=new ArrayStack<>();
for(int i=0;i<s.length();i++) {
char c=s.charAt(i);
if(c == '(' || c == '[' || c == '{')
stack.push(c);
else{
if(stack.isEmpty())return false;
char topChar=stack.pop();
if(c == ')' && topChar != '(')
return false;
if(c == ']' && topChar != '[')
return false;
if(c == '}' && topChar != '{')
return false;
}
}
return true;
} public static void main(String[] args) {
System.out.println(new Solution().isValid("()[]{}"));
System.out.println(new Solution().isValid("([)]"));
}
} 输出:
true
flase

ok,今天的学习就这样了。有什么问题,希望各位能够多多指正。

对于学习,四个字概括:至死方休

<数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)的更多相关文章

  1. 【C#数据结构系列】栈和队列

    一:栈 栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作 ...

  2. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  3. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  4. <数据结构系列3>队列的实现与变形(循环队列)

    数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...

  5. 【JavaScript数据结构系列】03-队列Queue

    [JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...

  6. 【JavaScript数据结构系列】04-优先队列PriorityQueue

    [JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...

  7. 【JavaScript数据结构系列】02-栈Stack

    [JavaScript数据结构系列]02-栈Stack 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的 ...

  8. 【JavaScript数据结构系列】01-数组Array

    [JavaScript数据结构系列]01-数组Array 码路工人 CoderMonkey 转载请注明作者与出处 # [JavaScript数据结构系列] # 01-数组Array 数组: 是有序的元 ...

  9. 【JavaScript数据结构系列】00-开篇

    [JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...

随机推荐

  1. docker compose无法解析正确的版本

    docker compose无法解析正确的版本.如果你使用了一个左双引号,而不是正常的双引号,docker compose将解析版本为“2”,而不是2.应该改为: version: "2&q ...

  2. 使用pdo,使用pdo无法插入数据怎么办

    如果你使用了最新版的XAMPP,那么你几乎不用改变php.ini的设置,就可以使用pdo but,插了一晚上,程序既不报错也不插入数据,真是气死人,后来发现是实例化pdo对象的时候没有指定字符集.所以 ...

  3. 2017 网易游戏互娱游戏研发4.21(offer)

    网易游戏互娱(offer) 去年这个时候就参加过网易游戏的实习生招聘,到今年总共收到了4次拒信.不过这次运气好,终于get了最想要的offer.去年实习生互娱笔试挂,秋招笔试挂,今年春招互娱投了连笔试 ...

  4. Acwing-274-移动服务(DP)

    链接: https://www.acwing.com/problem/content/276/ 题意: 一个公司有三个移动服务员,最初分别在位置1,2,3处. 如果某个位置(用一个整数表示)有一个请求 ...

  5. 【leetcode】1233. Remove Sub-Folders from the Filesystem

    题目如下: Given a list of folders, remove all sub-folders in those folders and return in any order the f ...

  6. async异步改同步后怎么监听错误

    当我们使用readFile()这种api,它第一个参数是报的错误,当使用async.await把它改写成同步,我们可以使用try  { }catch{ }解决.

  7. c++11:lambda表达式的使用

    lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...

  8. 计算机网络(五),TCP四次挥手

    目录 1.TCP四次挥手详情 2.为什么会有TIME-WAIT状态 3.为什么需要四次握手才能断开连接 4.服务器出现大量CLOSE_WAIT的原因 五.TCP四次挥手 1.TCP四次挥手详情 (1) ...

  9. KMP模版 && KMP求子串在主串出现的次数模版

    求取出现的次数 :  #include<bits/stdc++.h> ; char mo[maxn], str[maxn];///mo为模式串.str为主串 int next[maxn]; ...

  10. centos 中 redis 的安装

    安装流程 Wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar xzf redis-5.0.4.tar.gz mv redis-5 ...