数据结构:手动编写Java栈
来源:互联网 发布:用在淘宝上的比价神器' 编辑:程序博客网 时间:2024/06/08 14:14
栈
- 栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出(last-in-first-out, LIFO)的原则
栈ADT
作为一种抽象数据类型(ADT),栈必须支持下列的基本方法:
- push():将对象压至栈顶,并输出栈顶对象
- pop():若栈非空,则将栈顶元素移除,并将其返回;否则,报错
- getSize():返回栈内当前对象的数目
- isEmpty():检查栈是否为空
- top():若栈非空,则返回栈顶对象(但并不移除);否则,报错
异常
Java抽象数据类型的实现过程通常可以分为两步。首先,要给出期应用程序接口(API),接口的作用就是明确ADT所支持的方法的名称、声明和调用的形式。此外还要针对各种可能出现的错误条件,定义相应的异常
- 定义ExceptionStackEmpty异常——在对空战应用pop()或top()方法时,这一异常就会被抛出,以报告错误
package com.stack;/** * 定义ExceptionStackEmpty异常——在对空战应用pop()或top()方法时,这一异常就会被抛出,以报告错误 * @author Vinsmoke * */public class ExceptionStackEmpty extends RuntimeException{ public ExceptionStackEmpty(String err){ super(err); }}
Stack接口
package com.stack;/** * 栈接口的定义 * 对一些操作需要抛出异常 * @author Vinsmoke * */public interface Stack { public int getSize(); //返回栈中的元素数目 public boolean isEmpty(); //判断栈是否为空 public Object top() throws ExceptionStackEmpty; //取栈顶元素(但不删除) public void push(Object e); //入栈 public Object pop() throws ExceptionStackEmpty; //出栈}
基于数组的简单实现
package com.stack;import java.util.Arrays;/** * 借助定长数组以及数组扩容实现Stack接口 * 由于Java数组的元素都是从0开始编号,所以top必须初始化为-1;反过来,只要top=-1,就说明栈为空 * @author Vinsmoke * */public class Stack_Array implements Stack{ public static final int CAPACITY=1024; //数组的默认容量 protected int capacity; //数组的实际容量 protected Object[] s; //对象数组 protected int top=-1; //栈顶元素的位置,数组索引值 //构造方法一:按默认容量创建栈对象 public Stack_Array(){ this(CAPACITY); //调用构造方法二 } //构造方法二:按指定容量创建对象 public Stack_Array(int capacity) { this.capacity=capacity; s=new Object[capacity]; } //获取当前栈的规模,即已有元素个数 @Override public int getSize() { return (top+1); } //测试栈是否为空 @Override public boolean isEmpty() { return (top<0); } //取栈顶元素 @Override public Object top() throws ExceptionStackEmpty { if(isEmpty()) throw new ExceptionStackEmpty("异常:栈空"); return s[top]; } //入栈 @Override public void push(Object e) { //检测是否需要扩容 if((top+1)>=capacity){ Object[] temp=new Object[capacity+(capacity>>1)]; for(int i=0; i<temp.length; i++) if(i<s.length) temp[i]=s[i]; else temp[i]=null; //空对象 s=temp; capacity=capacity+(capacity>>1); //Attention:capacity的值需要变化 } s[++top]=e; } //出栈 @Override public Object pop() throws ExceptionStackEmpty { Object elem; if(isEmpty()) throw new ExceptionStackEmpty("异常:栈空"); elem=s[top]; s[top--]=null; //置空 return elem; }}
测试
package com.stack;public class Test { public static void main(String[] args) { Stack_Array s=new Stack_Array(5); //初始5个元素容量的栈 for(int i=0; i<12; i++) s.push(i); System.out.println("栈的实际容量:"+s.capacity); System.out.println("栈顶元素的位置(索引值):"+s.top); while(!s.isEmpty()){ System.out.print(s.pop()+" "); } }}
运行结果
栈的实际容量:15栈顶元素的位置(索引值):1111 10 9 8 7 6 5 4 3 2 1 0
阅读全文
0 0
- 数据结构:手动编写Java栈
- java编写数据结构
- 手动编写 Makefile文件
- 手动编写 Makefile文件
- 手动编写Struts
- 手动编写Servlet
- ___19__C#手动编写Stack类,模拟栈的数据操作
- 手动编写代码创建数据表
- 手动编写一个Servlet程序
- Cocosd2d 手动编写一个shader
- 手动编写、编译一个servlet
- 手动编写一个弹出框
- 手动编写“显示桌面”的代码
- 手动diy编写防ARP攻击批处理文件
- 手动编写第一个struts2程序
- 手动编写部署第一个servlet
- 手动编写最简单win32窗口
- 利用Editplus,手动编写第一个Servlet
- hadoop之hadoop配置
- Keepalived+Nginx+Redis+Tomcat实现高可用web负载均衡
- Javaweb开发(前端和后端学习资料)
- numpy库
- 关于指针传递和指针的引用传递
- 数据结构:手动编写Java栈
- Solr之高亮显示-yellowcong
- 介绍一种音频信号分类方法
- python时间格式输出 以及递增 日期加一天
- Spring 事务
- Oracle 存储过程样例
- FMDB保存数组和字典
- Cassandra_架构
- Mac 打开、编辑 .bash_profile 文件