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. DoModal 函数的用法

    转载:https://blog.csdn.net/mpp_king/article/details/79707728                        https://www.cnblog ...

  2. 怎么写一个Activity

    a.新建一个类继承Actitvity b.重写oncreate方法 setContentView(R.layout.XXX);//设置布局文件 c.注册activity <activity an ...

  3. JavaScript打印给定区间年份的闰年

    要求: 用户输入需要判断的年份区间,开始年份和结束年份,输出该区间内所有的闰年. 代码实现: function isRunYear(year) { // 是闰年返回true,否则返回false var ...

  4. 发现3 .js与Android和英特尔XDK

    下载example3.zip - 456.5 KB 下载apk14.zip - 6.8 MB 下载apk13.zip - 6.8 MB Introduction  本文是关于使用Intel XDK和t ...

  5. ThreadLocal什么时候会出现OOM的情况?为什么?

    ThreadLocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好 ...

  6. Chrome浏览器调试移动端网页,测试人员也可以轻松debug

    现在的产品,移动端应用占据很大市场,在测试过程中,就会测试各种各样的移动端页面.测试过程,或多或少会发现些问题,无非就是前端.后端问题.后端接口问题,可以利用工具:Fiddler或charles抓包查 ...

  7. day10 Pyhton学习

    一.昨日内容回顾 函数: 定义:对功能或者动作的封装 def 函数名(形参): 函数体 函数名(实参) return:  返回,当程序运行到return的时候,终止函数的执行 一个函数一定拥有返回值 ...

  8. C# Timer用法及实例讲解

    摘自:http://www.cnblogs.com/xcsn/archive/2013/05/10/3070485.html 1.C# Timer用法及实例详解 http://developer.51 ...

  9. 一份超全的Python学习资料汇总

    一.学习Python必备技能图谱二.0基础如何系统学习Python?一.Python的普及入门1.1 Python入门学习须知和书本配套学习建议1.2 Python简史1.3 Python的市场需求及 ...

  10. 最新版Python 3.8.6 版本发布

    Python 3.8.6 发布了,它是 Python 3.8 的第六个维护版本. 3.8 系列的维护版本将每两个月定期更新一次,3.8.7 计划于 2020 年 11 月中旬发布. 随着维护版本的发布 ...