3.6 栈 ADT

栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部。对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素。

栈是一个表,因此任何实现表的方法都能实现栈。显然 ArrayList 和 LinkedList 都支持栈操作;因为栈操作是常数时间操作,除非在非常特殊的情形下,不能产生明显改进。

栈的链表实现

在表的顶端或末端插入来实现进栈,删除顶端或末端实现出栈。

栈的数组实现

在表的末端插入实现进栈,删除末端实现出栈。

栈的应用

平衡符号

编译器检查程序语法错误时,经常由于符号错误导致,大量诊断报错。因为每个右括号必然对应其相应的左括号如{([])}是合法的,[({)]}是不合法的。通过栈可以方便的检查符号:

一个空栈,从文件头部读入字符到文件尾。如果字符是左半部分则进栈,如果字符是右半部分,当栈空时报错,否则将左半部分出栈。如果出栈的符号不是对应的左半部分则报错。文件读完,栈非空则报错。

后缀表达式

使用科学计算器计算时对于乘除法优先于加减法的记法。例如:

3 × 5 + 4 + 9 ÷ 3 = 22 将被记录为 3 5 × 4 + 9 3 ÷ +

当见到一个数时,将其进栈,遇到一个运算符该运算符作用于出栈的两个数上。再讲所得结果进栈。就可以不必知道优先规则而直接计算。

中缀到后缀的转换

除了用了计算后缀表达式,栈同样可以将标准形式表达式(中缀表达式)转换为后缀式。

读到操作数时立即将其放到后缀式中,操作符则进入栈中(包括括号)。当栈中存在高优先级操作符,且下个操作符是低优先级时,将高优先级操作符出栈到后缀式,低优先级操作符进栈。左括号进栈后在遇到右括号前不出栈。读到有括号时则一直出栈直到左括号出栈。括号出栈时不添加到后缀式中。

3.7 队列 ADT

队列也是表,基本操作是入队,在队尾插入一个元素;出队,在队头删除一个元素。

队列的数组实现

队列的链表实现很简单。

下面是使用数组实现的队列,用到了循环数组,否则数组的空间将被很快耗尽。

public class MyArrayQueue<E> {

    private int front;
private int back;
private E[] queue;
private int theSize;
public static final int DEFAULT_CAPACITY = 10; public MyArrayQueue() {
theSize = 0;
ensureCapacity(DEFAULT_CAPACITY);
front = queue.length / 2;
back = front;
} /**
* 扩容数组的同时需要对队列进行拼接
*
* @param newCapacity 新数组长度2倍
*/
public void ensureCapacity(int newCapacity) {
if (newCapacity < theSize) {
return;
}
E[] old = queue;
queue = (E[]) new Object[newCapacity];
if (back < front) {
for (int i = front; i < theSize; i++) {
queue[i] = old[i];
}
for (int i = 0; i < back + 1; i++) {
queue[theSize + i] = old[i];
}
back = front + theSize - 1;
} else {
for (int i = 0; i < theSize; i++) {
queue[i] = old[i];
}
}
} public void enqueue(E e) {
if (queue.length == theSize) {
ensureCapacity(theSize * 2);
}
if (theSize != 0) {
if (back == queue.length - 1) {
back = 0;
} else {
back++;
}
}
queue[back] = e;
theSize++;
} public E dequeue() {
if (theSize == 0) {
return null;
}
E returnVal = queue[front];
if (front == queue.length - 1) {
front = 0;
} else {
front++;
}
theSize--;
return returnVal;
}
}

3.6 栈 ADT - 3.7 队列 ADT的更多相关文章

  1. 【转】This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

    原文网址:http://1982106a.blog.163.com/blog/static/8436495620149239361692/ 预览layout.xml文件时提示: This versio ...

  2. 《算法实战策略》-chaper19-队列、栈和双端队列

    对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构.而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编 ...

  3. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  4. js中的栈、堆、队列、内存空间

    栈(stack) .堆(heap). 队列(queue)是js的三种数据结构. 栈(stack) 栈的特点是"LIFO,即后进先出(Last in, first out)".数据存 ...

  5. This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

    地址:http://stackoverflow.com/questions/18852983/eclipse-reports-rendering-library-more-recent-than-ad ...

  6. java基础编程——用两个栈来实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目代码 /** * <分析>: * 入队:将元素进栈A * 出队:判断栈B是否为空, * ...

  7. 两个栈来实现一个队列的C++代码

    利用两个栈来实现一个队列, 这个问题非经常见.  最关键的是要有好的思路, 至于实现, 那是非常easy的事情了. 在本文中, 也想说说自己的思路, 可是. 我认为用代码来表述思路更符合我的习惯. 也 ...

  8. 面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.ut ...

  9. 剑指offer5:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    1. 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 2. 思想 (1)栈的特点是先进后出,而队列的特点是先进先出: (2)因此,入队列的情况和入栈的情 ...

随机推荐

  1. 056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用

    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用 本文知识点:数组的实际应用 程序开发中如何应用数组? 程序代码及其运行结果: 不同数据类 ...

  2. 025 01 Android 零基础入门 01 Java基础语法 03 Java运算符 05 if条件结构

    025 01 Android 零基础入门 01 Java基础语法 03 Java运算符 05 if条件结构 本文知识点:Java中的if条件结构语句 关系运算符回顾 生活中根据条件进行判断采取不同操作 ...

  3. FOV

    来源:https://blog.csdn.net/chepwavege/article/details/98876550 视场 (视图字段) 是指现场对面相机镜头的立体角.图如下图所示︰ 高频通气︰  ...

  4. Create a cursor from hardcoded array instead of DB

    https://stackoverflow.com/questions/18290864/create-a-cursor-from-hardcoded-array-instead-of-db Crea ...

  5. 【5】进大厂必须掌握的面试题-Java面试-spring

    spring面试问题 Q1.什么是spring? Spring本质上是一个轻量级的集成框架,可用于用Java开发企业应用程序. Q2.命名Spring框架的不同模块. 一些重要的Spring Fram ...

  6. leaflet如何加载10万数据

    作为一名GIS开发者,你工作中一定遇到过这种问题,根据业务设计,需要在地图上添加1万+条数据,数据或是点.或是线.或是面.但不管哪种,当你添加到5000条时,地图操作就会出现明显的卡顿.当你添加超过1 ...

  7. bootStrap小结3

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  8. 【转载】opencvVS2019配置方法

    环境: 系统:win10系统截至2020920版本 opencv版本:3.0.0版本 IDE:宇宙最强IDEA最新版本2019社区版 教程: 1.下载opencv安装包官网下载链接:https://o ...

  9. NET::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)

    错误信息: NET::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK) 错误背景:微服务不通过统一的nginx端口访问,能够正常请求接口并获取对应的响应.但是通过ngi ...

  10. C++分隔字符串split

    split C++标准库中没有提供split分隔字符串的函数,哎. 实现一 下面的实现需要指定分隔符的集合delimiters,以及是否将连续的分隔符看作同一个分隔compress : enum cl ...