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的更多相关文章
随机推荐
- IOS的变量前加extern和static字段
IOS的变量前加extern和static字段 前一阵子,做项目的时候到网上找Demo,打开运行的时候发现其中变量前有关键字extern和static,所以我研究了一下子 对于extern来说可以理解 ...
- ajax 请求超过了5s 还没有返回 的话 就自动取消
ajax请求时有个参数可以借鉴一下 var ajaxTimeOut = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : ' ...
- WPF制作子窗体的弹出动画效果
创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...
- 2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据
一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: "]) { [self performSegueWithIdentifier:@" ...
- Spring中配置文件applicationContext.xml配置详解
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- MAC PHP MARK
这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一 ...
- linux常用命令:3文件搜索命令
文件搜索命令 1. 命令名:find 命令所在路径:/bin/find 执行权限:所有用户 语法:find [搜索范围] [匹配条件] 功能描述:文件搜索 文件搜索类型 通过文件名搜索 -name ...
- Android与服务器http连接模块代码
package com.example.httpdemo2; import java.io.BufferedReader; import java.io.IOException; import jav ...
- 【LeetCode OJ】Interleaving String
Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...
- 并列div自动等高
并列div自动等高 方法一:css控制 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...