栈是一种数据结构,它代表只能在某一端进行插入、删除操作的特殊线性表。

栈的最大特点是是后进先出(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的更多相关文章

随机推荐

  1. Javascript 的类型转换之减号

    专职写JS已经有一个月了(对,没错就是一个月),从2014年11月24实习开始到今的2月份,我做的工作一直都是切图,另外跟着老板学产品,现在我一听到切图两字,我就想吐...所以我找了一份专职写JS的工 ...

  2. Ubuntu 14.10 下安装Synergy,不同电脑之间公用一套键盘鼠标

    因为工作时候有多台电脑放在一起,如果每个用一套键盘鼠标很是不方便,所以希望能够不用电脑之间公用一套键盘鼠标. Synergy可以实现不同电脑之间公用一套键盘鼠标,并且支持简单的复制粘贴.很好用. 它还 ...

  3. android手机连接PC无法正常安装驱动

    工作当中我们经常会遇到Android手机连接PC的时候无法正确安装驱动,或者安装失败.当然找到正确的驱动文件时首选的解决方案,如果正确的驱动文件依旧无法安装成功我们可以打开我的电脑-->属性-- ...

  4. Android的切图标准

    最近总是有人在问我,Android怎么切图啊,怎么适配啊,不只是Android同行,还有很多新手ui设计师. 于是我就写篇文章,根据我们平时的开发经验,简单的介绍一下吧. 如果UI设计师以1920*1 ...

  5. magento中某个商店实现部分样式

    在magento的某个website中,已经有一个storeview A,现在要求在这个website下再创建一个新的storeview B,现在要求对于storeview B只有主页和分类页应用新的 ...

  6. Web 数据可视化

    /***************************************************************************************** * Web 数据可 ...

  7. js校验表单后提交表单的三种方法总结(转)

    第一种: 代码如下: <script type="text/javascript"> function check(form) { if(form.userId.val ...

  8. android studio 中怎么使用adb无线调试

    之前再eclipse下进行安卓开发,但谷歌却抛弃了eclipse而力挺android studio开发环境,没办法只好跟着走. 在eclipse下开发时调试用adb无线方式特别方便,但是在androi ...

  9. sk_buff 结构分析

    sk_buff分析 sk_buff是Linux网络代码中最重要的结构体之一.它是Linux在其协议栈里传送的结构体,也就是所谓的“包”,在他里面包含了各层协议的头部,比如ethernet, ip ,t ...

  10. USB 描述符

    标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. // Standard Device Descriptor typedef struct { u8 ...