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的更多相关文章
随机推荐
- win下隐藏任务栏
C# 隐藏任务栏开始按钮 关闭shell 分类: .NET C# 2011-07-14 15:26 789人阅读 评论(1) 收藏 举报 shell任务c#stringnulluser 一.隐藏任务栏 ...
- Mac环境下装node.js,npm,express
1. 下载node.js for Mac 地址: http://nodejs.org/ 直接下载 pkg的,双击安装,一路点next,很容易就搞定了. 安装完会提醒注意 node和npm的路径是 /u ...
- "由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的解决方案
先使用如下命令登录到服务器: mstsc /v:{服务器IP} /admin 然后再使用下列方法之一即可. 方法一: 1.单击“开始→运行”,输入“gpedit.msc”打开组策略编辑器窗口,依次定位 ...
- Inno Setup的常用脚本
Inno Setup的常用脚本 分类: VC++神奇理论 2012-12-06 10:07 3234人阅读 评论(2) 收藏 举报 安装不同的目录: [Files] Source: "我的程 ...
- Smart210学习记录-----linux定时器
1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 stru ...
- Web应用开发工具及语言需要具备的功能探索
1 前言 最近一个多月在做Web项目,用到的技术有(也不算泄漏公司机密吧): 后台:Struts 2(with JSP/FreeMarker).Spring.Hibernate.MySQL.Web S ...
- taglib 自定义标签
自定义<%@ taglib prefix="cf" uri="http://training.bmcc.com.cn/tld/functions"%> ...
- php 函数积累
array_slice()<?php $a=array("red","green","blue","yellow" ...
- 软件工程课程作业(三)--四则运算3(C++)
伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思路 在此前程序拥有的功能:加减有无负数,除法有无余数以及算式可定制的功能的基础上,此次程序又添加了算式结果的 ...
- bootstrap-3
段落: 1.全局文本字号为14px(font-size); 2.行高为1.42857143(line-height),大约是20px(一串数字是由less编译器计算出来的,当然sass也有这样的功能) ...