哎,上周还是没有坚持写博客,也许可能是因为聚会吧和实习的缘故吧,但这些都不是理由,现在到中科院了,时间就很充分了,以后每周坚持至少写3篇。废话少说,今天开始学基本数据结构,第一讲栈!
栈:作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
栈可以用来在
函数
调用的时候存储断点,做
递归
时要用到栈!
Java具体实现:
<pre name="code" class="java">package com.tangbo;
import java.lang.reflect.Array;
public class Stack<T> {
private int top;
private int length;
T [] stack;//声明一个栈
@SuppressWarnings("unchecked")
public Stack(int length) {
this.length = length;
this.stack = (T[])Array.newInstance(Object.class,length);//不能用 stack = new T[length]初始化,当实现一个泛型类时,您可能想要构造一个数组T[]。因为泛型是通过擦除(erasure)实现的,所以这是不允许的。//您可以尝试把Object[]强制转换为T[]。但这是不安全的。具体化解决方案按照泛型教程的惯例,解决方案使用的是“类型令牌”,通过向构造函数添加一个Class<T>参数,可以强制客户端为类的类型参数提供正确的类对象。详见:http://www.cnblogs.com/Fskjb/archive/2009/08/23/1552506.html
this.top = -1;//初始化栈顶
}
public boolean stackEmpty() {//判断栈是否满
boolean isEmpty = false;
if(top==-1)
{
isEmpty = true;
}
return isEmpty;
}
public boolean statckFull()//判断栈是否为空
{
boolean isFull = false;
if((top+1)==length)
{
isFull = true;
}
return isFull;
}
public void push(T t) {//入栈
if(statckFull())
{
System.err.print("栈满了!");
}else
{
top++;
stack[top] = t;
}
}
public T pop() {//出栈
T t=null;
if(stackEmpty())
{
System.err.print("栈为空!");
}else
{
t = stack[top];
top--;
}
return t;
}
public int stackLength() {//返回栈的长度
return top+1;
}
}
测试类:
package com.tangbo;
public class Test {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>(2);
stack.push(2);
stack.push(3);
int length = stack.stackLength();
for(int i=0;i<length;i++)
{
System.out.println("i="+i+":"+stack.pop());
}
}
}
源码下载地址: http://pan.baidu.com/s/1mgqna3m