一.栈 Stack

栈也是一种线性的数据结构

相比数组,栈相对应的操作是数组的子集。

只能从一端添加元素,也只能从一端取出元素。这一端成为栈顶。

1,2,3依次入栈得到的顺序为 3,2,1,栈顶为3,只能取出栈顶的元素3(出栈)。

栈是一种后进先出的数据结构 LIFO(Last In First Out)

栈的应用

1.无处不在的Undo操作(撤销)

2.程序调用的系统栈

编程时,用到子过程调用时,当一个子过程执行完成之后自动回到上层中断的位置:

系统栈记录每次调用过程中中断的那个点

function A(){
... //1
B() //
... //3 }
function B(){
... //1
C() //
... //3 }
function B(){
... //1
... //
... //3 }

A2 B2依次入栈 B2 A2依次出栈

3.编译器 括号匹配(第三条会用代码实现)

二.栈的基本实现(基于动态数组)

Stack<E>   5个方法

void push(E)  入栈  O(1)均摊

E pop()  出栈 O(1)均摊

E peek()  查看栈顶元素   O(1)

int getSize()  栈里元素个数   O(1)

boolean isEmpty()    判断栈是否为空   O(1)

具体底层实现,用户不关心,实际底层有多种实现方式。

设置Interface Stack<E>,设置五种方法,用类ArrayStack<E>继承接口具体实现(基于第一章动态数组)

Interface Stack<E>

public interface Stack<E> {

    int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek(); }

ArrayStack<E>继承接口

public class ArrayStack<E> implements Stack<E>

1.基本的构造函数

  Array<E> array;

    public ArrayStack(int capacity){
array = new Array<>(capacity);
} public ArrayStack(){
array = new Array<>();
}

基础操作:判断是否为空,获取栈中元素个数,获取栈的容量

    @Override
public int getSize() {
return array.getSize();
} @Override
public boolean isEmpty() {
return array.isEmpty();
} public int getCapacity(){
return array.getCapacity();
}

2.入栈操作

@Override
public void push(E e) {
array.addLast(e);
}

3.出栈操作

@Override
public E pop() {
return array.removeLast();
}

在第一章动态数组的Array类中加入getLast()和getFirst()方法得到动态数组的最后一个数和第一个数

其中注意,return get(size - 1); 不可写为return data[size - 1];因为万一size为0,data[-1]索引不合法

//获取index索引位置的元素
E get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get failed. Index is illegal");
}
return data[index];
} public E getLast(){
return get(size-1);
//return data[size - 1]; 万一size为0,产生不合法索引
} public E getFirst(){
return get(0);
}

4.栈的查看栈顶操作

 @Override
public E peek() {
return array.getLast();
}

5.重写toString方法,让输出更具有可读性

    @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(i != array.getSize()-1){
res.append(",");
}
}
res.append("] top");
return res.toString();
}

三.栈的括号匹配

思想:将一个字符串遍历,对于每一个字符如果为左括号就入栈,如果为右括号,就查看此时栈顶的元素是否为匹配的左括号,如果不是就return false,最后return stack.isEmpty();而不是true。

栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素。

  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 stack.isEmpty();
}

<数据结构基础学习>(三)Part 1 栈的更多相关文章

  1. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  2. Python基础学习三

    Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...

  3. Django基础学习三_路由系统

    今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...

  4. <数据结构基础学习>(三)Part 2 队列

    一.队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素. (排队) 队列是一种先进先出的数据结构(先到先得)FIFO ...

  5. C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...

  6. <数据结构基础学习>(四)链表 Part 1

    一.链表基础 动态数组.栈.队列底层都是依托静态数组实现的,靠resize来解决固定容量问题. 链表是真正的动态数据结构,是一种最简单的一种动态数据结构. 更深入的理解引用(或者指针). 更深入的理解 ...

  7. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  8. salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

    在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresi ...

  9. C语言数据结构基础学习笔记——B树

    2-3树:是一种多路查找树,包含2结点和3结点两种结点,其所有叶子结点都在同一层次. 2结点:包含一个关键字和两个孩子(或没有孩子),其左孩子的值小于该结点,右孩子的值大于该结点. 3结点:包含两个关 ...

随机推荐

  1. IBGP默认的TTL值为255

    结论: 1.IBGP默认的TTL值为255 组网图: 抓包内容: 1.在AR1和AR2之间抓包,只显示BGP包,显示内容如下:

  2. Xamarin 打包生成 Android apk 文件

    Visual Studio 支持 apk 发布 Xamarin.Forms项目或Xamarin.Android项目开发完成之后需要发布.比较常规的发布方式是生成 apk 文件,微软也考虑到开发者有发布 ...

  3. 章节九、3-Desired Capabilities介绍

    一.Desired Capabilities是selenium webdrive中已经写好的一个类,我们可以通过它来告诉selenium webdrive在Desired Capabilities是什 ...

  4. Android PAI (PlayAutoInstall)预装APK 功能

    最近刚找到工作,是手机方案公司,刚接触手机系统预装的APP,以及解决方案MTK平台下预装APP的bug,也接触到了Launcher的东西. 然后接触到了第一个需求 PAI预装APK功能 下面是我用到的 ...

  5. spring学习总结——高级装配学习一(profile与@Conditional)

    前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...

  6. Saltstack_使用指南07_远程执行-执行模块

    1. 主机规划 远程执行教程文档 https://docs.saltstack.com/en/latest/topics/tutorials/modules.html 所有模块文档 https://d ...

  7. Windows server 2012 R2 部署WSUS补丁服务

    一.WSUS 安装要求 1.硬件要求: 对于多达 13000 个客户端的服务器,建议使用以下硬件:* 4 Core E5-2609 2.1GHz 的处理器* 8 GB 的 RAM 2.软件要求: 要使 ...

  8. luffy项目后台drf搭建(1)

    一 进入虚拟环境 打开crm,输入命令 workon luffy 虚拟环境使用文档 二 安装基本类库 pip install django pip install PymySQL pip instal ...

  9. Enterprise Architect 时序图

    添加时序图 1,在类图下面新建包 添加sequence时序图 点击流程控制,可以打开流程控制设计界面 我选择的是Lifeline线,你可以选择都差不多. 点击其中一条liftline连到其他上面 双击 ...

  10. Configuring High Availability and Consistency for Apache Kafka

    To achieve high availability and consistency targets, adjust the following parameters to meet your r ...