JAVA数据结构系列 栈
java数据结构系列之栈
手写栈
1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为它要维护自己的指针(Next)引用。
package com.rsc.stack;
import java.util.LinkedList;
/**
* 利用链表实现的栈
* @author 落雨
* http://ae6623.cn
* @param <T>
*/
public class LinkedListStack<T> {
LinkedList<T> list;
public LinkedListStack() {
list = new LinkedList();
}
/**
* 出栈
*
* @return
*/
public T pop() {
return list.removeLast();
}
/**
* 入栈
*
* @param t
*/
public void push(T t) {
list.add(t);
}
public T getTop() {
return list.getLast();
}
public boolean isEmpty() {
return list.size() == 0;
}
public int getSize() {
return list.size();
}
public static void main(String[] args) {
LinkedListStack<String> ls = new LinkedListStack<String>();
System.out.println(ls.getSize());
ls.push("2");
ls.push("我");
ls.push("你");
ls.push("他");
ls.push("1");
ls.push("3");
ls.push("5");
System.out.println(ls.getSize());
System.out.println(ls.getTop());
ls.pop();
System.out.println(ls.getSize());
System.out.println(ls.getTop());
ls.push("嘿嘿");
System.out.println(ls.getSize());
System.out.println(ls.getTop());
}
}
打印结果:
0
7
5
6
3
7
嘿嘿
2.利用数组实现的栈,好处是速度快,坏处是要考虑数组的扩容,既然要扩容,肯定就涉及数组元素的拷贝,一对一的一个萝卜一个坑的塞过去,相对链表来说,它的插入和删除就比链表要快,因为它不用维护指针(Next),不懂这个指针next的同学,自行脑补链表的实现方式,下节会说到链表的实现。
package com.rsc.stack;
import java.util.Arrays;
/**
* 利用数组实现的栈的数据结构
*
* @author
* 落雨 2015年6月5日 http://ae6623.cn
*
*/
public class ArrayStack {
public Object[] t;// 存数的数据数组
int top = 0;// 默认Top为0
public ArrayStack(int size) {
t = new Object[size];
}
public boolean isEmpty() {
return top == 0;
}
public boolean clean() {
top = 0;
return true;
}
public void pop() {
if (top > 0) {
t[--top] = null;
}
System.out.println(getTop());
}
public void push(Object o) {
// 检测扩容
if (top >= t.length) {
int newCapacity = (t.length * 3) / 2 + 1; // 增加50%+1
Object[] newObject = new Object[newCapacity];
int k = 0;
for (Object i : t) {
newObject[k++] = i;
}
t = newObject;
}
t[top++] = o;
System.out.println(getTop());
}
public Object getTop() {
System.out.println("top:" + top);
printStack();
return top <= 0 ? null : "当前栈顶元素:" + t[top - 1];
}
public int getSize() {
return top;
}
public void printStack() {
System.out.println(Arrays.toString(t));
}
public static void main(String[] args) {
ArrayStack as = new ArrayStack(5);
as.push("1");
as.push("2");
as.push("3");
as.push("4");
as.push("5");
as.push("我");
as.push("6");
as.push("7");
as.printStack();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
as.pop();
}
}
打印结果:
top:1
[1, null, null, null, null]
当前栈顶元素:1
top:2
[1, 2, null, null, null]
当前栈顶元素:2
top:3
[1, 2, 3, null, null]
当前栈顶元素:3
top:4
[1, 2, 3, 4, null]
当前栈顶元素:4
top:5
[1, 2, 3, 4, 5]
当前栈顶元素:5
top:6
[1, 2, 3, 4, 5, 我, null, null]
当前栈顶元素:我
top:7
[1, 2, 3, 4, 5, 我, 6, null]
当前栈顶元素:6
top:8
[1, 2, 3, 4, 5, 我, 6, 7]
当前栈顶元素:7
[1, 2, 3, 4, 5, 我, 6, 7]
top:7
[1, 2, 3, 4, 5, 我, 6, null]
当前栈顶元素:6
top:6
[1, 2, 3, 4, 5, 我, null, null]
当前栈顶元素:我
top:5
[1, 2, 3, 4, 5, null, null, null]
当前栈顶元素:5
top:4
[1, 2, 3, 4, null, null, null, null]
当前栈顶元素:4
top:3
[1, 2, 3, null, null, null, null, null]
当前栈顶元素:3
top:2
[1, 2, null, null, null, null, null, null]
当前栈顶元素:2
top:1
[1, null, null, null, null, null, null, null]
当前栈顶元素:1
top:0
[null, null, null, null, null, null, null, null]
null
top:0
[null, null, null, null, null, null, null, null]
null
JAVA数据结构系列 栈的更多相关文章
- Java数据结构系列之——栈(2):栈的链式存储结构及其操作
package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...
- Java数据结构之栈(Stack)
1.栈(Stack)的介绍 栈是一个先入后出(FILO:First In Last Out)的有序列表. 栈(Stack)是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表. 允许插入和删 ...
- java数据结构-07栈
一.什么是栈 栈是一种线性结构,栈的特点就是先进后出(FILO):就像弹夹装子弹一样,最先压进去的在最底下,最后才被射出. 二.相关接口设计 三.栈的实现 栈可以用之前的数组.链表等设计,这里我使 ...
- java数据结构系列——排列(2):有序阵列
package Array; /** * 对数组排序.当添加到阵列保持有序数组元素: * @author wl * */ public class MyOrderArray { private lon ...
- java数据结构系列之——数组(1)
import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...
- Java数据结构系列——简单排序:泡、选择、直接进入
package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...
- Java数据结构系列(1)——自平衡二叉树
1.基本概念 所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素. 2.定义 TreeSet<Elemtype> s ...
- java 数据结构 栈的实现
java数据结构之栈的实现,可是入栈,出栈操作: /** * java数据结构之栈的实现 * 2016/4/26 **/ package cn.Link; public class Stack{ No ...
- 自己动手实现java数据结构(一) 向量
1.向量介绍 计算机程序主要运行在内存中,而内存在逻辑上可以被看做是连续的地址.为了充分利用这一特性,在主流的编程语言中都存在一种底层的被称为数组(Array)的数据结构与之对应.在使用数组时需要事先 ...
随机推荐
- VB 进制转换大全
'二进制转十进制 Public Function B2D(vBStr As String) As Long Dim vLen As Integer '串长 Dim vDec As Long '结果 D ...
- System.Transaction (TransactionScope) 与 可提升 (Promotable) 交易
这是我的备份,原文请看 http://www.dotblogs.com.tw/mis2000lab/archive/2014/11/12/transactionscope_promotable_tr ...
- Python脚本控制的WebDriver 常用操作 <一> 启动浏览器
由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...
- Oracle Database Cloud Services
Oracle 开始也把数据库服务作为PaaS 服务,好吧 Oracle 叫做 DBaaS,数据库服务 https://cloud.oracle.com/database?tabID=138367891 ...
- 转 在SQL Server中创建用户角色及授权(使用SQL语句)
目录 要想成功访问 SQL Server 数据库中的数据 我们需要两个方面的授权 完整的代码示例 使用存储过程来完成用户创建 实例 要想成功访问 SQL Server 数据库中的数据, 我们需要两个 ...
- word超链接显示HYPERLINK
在word中编辑超链接后显示的并不是正常的超链接 正常的超连接 非正常显示 解决办法: 文件---选项----高级,如下图 将“显示域代码而非值域”前面的勾去掉.
- Socket(2)
UDP: UDP协议没有socket之间的虚拟链路,也就是说没有“握手”阶段,只是发送接收. 可以想象成直播,直播时如果中间网络不好,不会事后重新播放之前的,而是直接跳过. 也就是说一方只负责发送,一 ...
- microsoft azure 速度测试网址
http://www.azurespeed.com/ 选择你附近的区域.可以使用 azurespeed.com 查找延迟最低的数据中心.
- http压力测试
一.http_load程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把 ...
- git的初步使用
1.在GitHub上建立项目登录GitHub后,你可以在右边靠中那里找到一个按钮“New Repository”,点击过后,填入项目名称.说明和网址过后就可以创建了,然后会出现一个提示页面,记下类似g ...