java_stack
栈是一种数据结构,它代表只能在某一端进行插入、删除操作的特殊线性表。
栈的最大特点是是后进先出(First In Last Out),对栈的操作主要是入栈和出栈,判断栈是否为空,计算栈的大小。
对栈而言,允许插入删除的一端是栈顶,另一端则称为栈底。
实际应用:表达式求值和语法解析,校验和解析XML,文本编辑器里的撤销动作,浏览器里的浏览记录
栈的顺序存储实现:(基于数组实现)
package collectionsFramework.stack; /**
* @Package collectionsFramework.stack * @ClassName: SequenceStack * @Description: TODO(这里用一句话描述这个类的作用) * @author andy * @date 2013-11-22 下午04:03:14 */
public class SequenceStack<T>{
//栈里面的元素个数
private int size = 0;
//栈的默认容量大小
private int defaultCapacity = 10;
//栈的容量
private int capacity;
//容纳栈的数组
private Object[] elementData;
//栈满了之后,增量大小
private int incrementCapacity; //默认大小的空堆栈
public SequenceStack(){
capacity = defaultCapacity;
elementData = new Object[capacity];
} //指定容量大小的空堆栈
public SequenceStack(int capacity){
elementData = new Object[this.capacity];
} //指定容量大小和增量大小的空堆栈
public SequenceStack(int capacity,int incrementCapacity){
this(capacity);
this.incrementCapacity = incrementCapacity;
} //保证空间足够
private void ensureCapacity() throws Exception{
if(elementData.length == size){
Object[] copyElementData = elementData; int length = 0;
if(incrementCapacity > 0){
length = copyElementData.length + incrementCapacity;
}else{
length = copyElementData.length<<1;
}
elementData = new Object[length];
try {
System.arraycopy(copyElementData, 0, elementData, 0, elementData.length-1);
} catch (Exception e) {
throw new Exception("扩充数组时出现系统错误!");
}
}
} //入栈
public synchronized T push(T object){
boolean flag = true;
if(null != object){
try {
ensureCapacity();
} catch (Exception e) {
try {
ensureCapacity();
} catch (Exception e1) {
System.out.println("第二次扩容再次失败!");
flag = false;
}
}
if(flag){
elementData[size++] = object;
return object;
}else{
return null;
}
} return null;
} //出栈
public synchronized T pop(){
if(size == 0){
throw new RuntimeException("空栈");
}
return (T)elementData[--size];
} //获取栈顶元素但不移除
public synchronized T peek(){
if(size == 0){
throw new RuntimeException("空栈");
}
return (T)elementData[size-1];
} //获取元素个数
public synchronized int size(){
return size;
} //堆栈是否为空
public boolean empty() {
return size() == 0;
} public static void main(String[] args) {
SequenceStack<String> stack = new SequenceStack<String>();
System.out.println("元素" + stack.push("a") + "入栈");
System.out.println("元素" + stack.push("b") + "入栈");
System.out.println("元素" + stack.push("c") + "入栈");
System.out.println("元素" + stack.push("d") + "入栈");
System.out.println("元素" + stack.push("e") + "入栈"); System.out.println("-----------");
System.out.println("栈顶元素:" + stack.peek());
System.out.println("元素个数:" + stack.size());
System.out.println("-----------");
while(stack.size > 0){
System.out.println("元素" + stack.pop() + "出栈");
} }
}
栈的链式存储实现:(保存本节点数据,并保存对下一个结点的引用即指针)跟单链表差不多
package collectionsFramework.stack; /**
* @Package collectionsFramework.stack
*
* @ClassName: LinkStack
*
* @Description: TODO(这里用一句话描述这个类的作用)
*
* @author andy
*
* @date 2013-11-22 下午05:58:55
*/
public class LinkStack<T> {
// 节点
private class Node {
// 保存本节点数据
private T data;
// 指向下个节点的引用
private Node next; public Node() { }
public Node(T data, Node next) {
this.data = data;
this.next = next;
}
} //栈顶元素
private Node top;
//节点数
private int size; //创建空链栈
public LinkStack(){
top = null;
} //以指定数据元素来创建链栈,该链栈只有一个元素
public LinkStack(T element){
top = new Node(element, null);
size++;
} //进栈
public synchronized T push(T element) {
if(size==0){
top = new Node(element,null);
}else{
Node oldTop = top;
top = new Node(element,oldTop);
} size++;
return top.data;
} //出栈
public synchronized T pop() {
if(!empty()){
Node oldTop = top;
top = oldTop.next;
oldTop.next = null;
size--;
return oldTop.data;
}
return null;
} //访问栈顶元素,但不删除栈顶元素
public synchronized T peek() {
if(!empty()){
return top.data;
}
return null;
} // 判断链栈是否为空栈
public boolean empty() {
return size == 0;
} // 返回链栈的长度
public synchronized int length() {
return size;
} public static void main(String[] args) {
LinkStack<Character> stack = new LinkStack<Character>();
System.out.println("元素:" + stack.push('a') + "进栈");
System.out.println("元素:" + stack.push('b') + "进栈");
System.out.println("元素:" + stack.push('c') + "进栈");
System.out.println("元素:" + stack.push('d') + "进栈");
System.out.println("元素:" + stack.push('e') + "进栈"); System.out.println("-------");
System.out.println("栈顶元素:" + stack.peek());
System.out.println("-------");
while(stack.size >0){
System.out.println("元素:" + stack.pop() + "出栈");
}
} }
java_stack的更多相关文章
随机推荐
- HTTP协议详解(经典)
转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...
- SWUST0249 (凸包面积)
type node=record x,y:longint; end; ; var k,q,qq:longint; sum:double; f,g:..maxn] of node; m,i,j,a,b: ...
- pscp使用详解 Windows与Linux文件互传工具
pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...
- 如何重置mysql的密码
如何重置mysql的密码 如果知道密码,则通过以下方式修改: gaurav@gaurav:~$ mysql --user=root --pass mysql Enter password: mysql ...
- 如何实现Magento产品批量导入?
从事外贸的我们在工作中,经常需要添加成千上万个的产品,如果一个一个的去上传,要花费很多时间,有是很让人头痛,那么应该如何实现产品批量上传?如果使用的是Magento系统的话,那么你现在有福利了,因为M ...
- iOS-NSThread使用
NSThread: 优点:NSThread 比其他两个轻量级(Cocoa NSOperation.GCD) 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 Coco ...
- 触控(Touch) 、 布局(Layout)
1 使用触控实现一个简易的画板 1.1 问题 触控(Touch)是一个UITouch类型的对象,当用户触摸了屏幕上的视图时自动被创建,通常使用触控实现绘图.涂鸦.手写等功能.本案例使用触控实现一个简易 ...
- LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)
思路: 主要判断左子树与右子树. 在判断左时,循环下去肯定会到达叶子结点中最左边的结点与最右边的结点比较. 到了这一步因为他们都没有左(右)子树了,所以得开始判断这两个结点的右(左)子树了. 当某 ...
- 关于IE6浮动问题!
以下内容均为个人笔记:望批评指教! IE6下应尽量少使用float 而是 换用display:inline 父层使用text-align:text:效果会好些: 如果一组浮动元素 产生了浮动 最好 ...
- Linux的服务器初始优化脚本。
#!/bin/bash #优化服务器启动的脚本.禁用无关账号.无关服务 #Lock User Account passwd -l xfs passwd -l news passwd -l nscd p ...