java数据结构之(堆)栈
(堆)栈概述
栈是一种特殊的线性表,是操作受限的线性表
栈的定义和特点
•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
•特点:先进后出(FILO)或后进先出(LIFO)
栈的结构,如下图所示:
线性表的操作主要包括:
(1)清空(堆)栈
(2)判断是否为空
(3)元素的个数
(4)入栈
(5)出栈
(6)取栈顶元素
接口
由此,对队列的抽象数据类型定义Queue接口如下:
package stack;
/**
* (堆)栈
* @author Administrator
*
*/
public interface Stack {
/**
* 清空堆栈
*/
public void clear();
/**
* 入栈
* @param obj 入栈的元素
*/
public void push(Object obj);
/**
* 出栈
* @return 出栈的结果
*/
public Object pop();
/**
* 判断是否为空
* @return
*/
public boolean isEmpty();
/**
* 求元素的个数
* @return 元素的个数
*/
public int size();
/**
* 取栈顶元素
* @return 栈顶元素
*/
public Object peek();
}
顺序(堆)栈
结构模型
栈顶指针top,指向实际栈顶后的空位置,初值为0。
栈的初始空间大小为M
top=0,栈空,此时出栈,则下溢(underflow);
top=M,栈满,此时入栈,则上溢(overflow);
源代码
package stack;
/**
* 顺序(堆)栈
* @author Administrator
*
*/
public class ArrayStack implements Stack{
private static int DEFAULT_SIZE = 100;
private int Top;
Object array[];
public ArrayStack() {
Top = 0;
array = new Object[DEFAULT_SIZE];
}
public boolean isEmpty() {
return 0 == Top ;
}
public void expand() {
Object[] newArray = new Object[2 * array.length];
for(int i=0; i<array.length; i++) {
newArray[i] = array[i];
}
array = newArray;
}
/*
public void expand() {
try {
Object[] newArray = new Object[2*DEFAULT_SIZE];
for(int i=0; i<array.length; i++) {
newArray[i] = array[i];
}
array = newArray;
}catch(OutOfMemoryError e) {
System.out.println("error in expand of Stack class!");
//e.printStackTrace();
}
DEFAULT_SIZE = 2*DEFAULT_SIZE;
}
*/
public void push(Object obj) {
if(Top == array.length) {
expand();
}
array[Top] =obj;
Top ++;
}
public Object pop() {
if(0 == Top) throw new IllegalStateException();
Object val = array[-- Top];
array[Top] = null;
return val;
}
public void clear() {
for(int i=0; i<array.length; i++) {
array[i] = null;
Top = 0;
}
}
public Object peek() {
if(0 == Top) throw new IllegalStateException();
return array[Top - 1];
}
public int size() {
return Top;
}
public String toString() {
String s = "[";
for(int i=Top-1; i>=0 ; i--) {
s = s + array[i];
s = s + ", ";
}
s = s + "]";
return s;
}
}
链式(堆)栈
结构模型
源代码
package stack;
/**
* 链式(堆)栈的结点
* @author luoweifu
*
*/
class Node{
Object data; //数据元素
Node next; //后驱结点
public Node() {
this(null);
}
public Node(Object data) {
this.data = data;
this.next = null;
}
}
/**
* 链式(堆)栈, 无头结点
* @author Administrator
*
*/
public class LinkStack implements Stack {
private Node top; //栈顶指针
private int size; //栈的大小
public LinkStack() {
top = null;
size = 0;
}
@Override
public void clear() {
top = null;
size = 0;
}
@Override
public void push(Object obj) {
Node p = new Node(obj);
if(top == null) {
top = p;
} else {
p.next = top;
top = p;
}
size ++;
}
@Override
public Object pop() {
Node p = top;
top = top.next;
size --;
return p.data;
}
@Override
public boolean isEmpty() {
if(size == 0)
return true;
else
return false;
}
@Override
public int size() {
return size;
}
@Override
public Object peek() {
return top.data;
}
public String toString() {
StringBuilder sb = new StringBuilder("[");
Node p = top;
if(p == null) {
sb.append("");
} else {
do{
sb.append(p.data + ", ");
}while((p = p.next) != null);
}
sb.append("]");
return sb.toString();
}
}
测试(堆)栈
package stack;
public class Test {
/**
* 测试堆栈
* @param args
*/
public static void main(String[] args) {
//Stack stack = new ArrayStack();
Stack stack = new LinkStack();
for(int i=0; i<10; i++) {
stack.push(i);
}
System.out.println(stack.toString());
Object a = stack.pop();
System.out.println(a + stack.toString());
stack.push(20);
Object b = stack.peek();
System.out.println( b + stack.toString());
stack.clear();
System.out.println( "数据数量:" + stack.size()
+ " isEmpty? " + stack.isEmpty() + " 数据为:" + stack.toString());
}
}
结果
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ]
9[8, 7, 6, 5, 4, 3, 2, 1, 0, ]
20[20, 8, 7, 6, 5, 4, 3, 2, 1, 0, ]
数据数量:0 isEmpty? true 数据为:[]
转载至:http://blog.csdn.net/luoweifu/article/details/8507836
java数据结构之(堆)栈的更多相关文章
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- Java数据结构之堆和优先队列
概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...
- Java数据结构系列之——栈(2):栈的链式存储结构及其操作
package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...
- java 数据结构与算法---栈
原理来自百度百科 一.栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表:它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数 ...
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- 5, java数据结构和算法: 栈 , 入栈, 出栈, 正序遍历,,逆序遍历
直接上代码: class ArrayStack{ //用数组模拟栈 int maxSize; int[] stack; int top = -1;//表示栈顶 public ArrayStack(in ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- java中的堆与栈
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...
- java中的堆、栈、方法区等比较
• 堆.栈.方法区 1. java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2. 堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(clas ...
随机推荐
- 教你把p标签的一行字掰弯文字换行): word-wrap: break-word;
1 使用前的p是这样: 2 使用后: p{ word-wrap: break-word; overflow: hidden; } 3 又想变直: p{ word-wrap: normal; ove ...
- 笔记本的Windows系统怎么设置有了外接鼠标后停用触摸板
点击控制面板,切换小图标模式,找到鼠标,点击它,然后会弹出一个窗口,找到ELAN选项卡(一般有个红色图标,不过可能需要对应驱动才会有此选项卡),选中插入外置 USB 指向装置时禁用.点击确定保存配置即 ...
- 零停重启程序工具Huptime研究
目录 目录 1 1. 官网 1 2. 功能 1 3. 环境要求 2 4. 实现原理 2 5. SIGHUP信号处理 3 6. 重启线程 4 7. 重启目标程序 5 8. 系统调用钩子辅助 6 9. 被 ...
- 字符串转换成NSDate类型的 为nil解决方法
方法一 通过下列函数来解决 但是得到的日期会改变 修改方法fix - (NSDate *)timeForString:(NSString *)string { NSMut ...
- centos7 磁盘管理—— lvm的使用
Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不 ...
- 21 Guns -- Green Day
21 Guns Green Day (绿日乐队)的代表曲之一.歌曲的主题是反战,同时安慰了曾 经信任布什政府如今失望透顶的美国民众.这首歌也被电影< ...
- 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)
蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含 ...
- Kafka consumer的参数
earliest: 当各分区下有已提交的offset时,从提交的offset开始消费:无提交的offset时,从头开始消费 latest :当各分区下有已提交的offset时,从提交的offset开始 ...
- 用ndp部署storm应用
本文由作者余宝虹授权网易云社区发布. 使用户ndp部署一个Java应用大家都非常熟悉的,但是看到某些同学用非常繁琐的方式部署storm应用的时候,我觉得很有必要整一个帮助教程,ndp帮助文档里面没有, ...
- Mac OS 10.12 - 如何关闭Rootless机制?
一,进入恢复模式(Recovery):具体操作方法参见下面这篇博客: http://www.cnblogs.com/sunylat/p/6414697.html 二,关闭Rootless机制 1,选择 ...