栈(stack)可以是一个“后进先出”的数据结构,先进入的元素在栈底,最后一个元素在栈顶,换言之,在栈里最后一个压入的元素将会是第一个取出来的。这里和其他java一样,入栈和出栈的元素都是Object类型。
这里我实现的栈的初始容量为10,当容量不够时自动扩容,每次扩容为原来的一倍。
pop()方法,可以返回栈顶元素的引用。
实现代码如下:
/* 程序来源:德国著名ERP软件公司S2005年10月面试题
* 源文件名称:Stack.java
* 要 点:
* 实现一个栈操作,将1~12月的英文单词压入栈中,
* 然后再将其取出,使用java代码实现。
*/
public class Stack{
private int CAPACITY = 10;
private int stackp = 0; //栈顶指针
Object[] objs;
public Stack(){
objs = new Object[CAPACITY];
}
public Stack(int capacity){
CAPACITY = capacity;
objs = new Object[CAPACITY];
}
public void push(Object obj){
if(stackp < CAPACITY){
objs[stackp] = obj;
stackp++;
}else{//如果栈满了自动扩容,每次扩大一倍
int temp_capacity = CAPACITY*2;
Object[] temp_objs = new Object[temp_capacity];
for(int i = 0;i<CAPACITY;i++){
temp_objs[i] = objs[i];
}
CAPACITY = temp_capacity;
objs = temp_objs;
objs[stackp] = obj;
stackp++;
}
}
public Object pop(){
Object obj = null;
if(stackp>0){
stackp--;
obj = objs[stackp];
objs[stackp] = null;
}
return obj;
}
public Object top(){
if(!isEmpty)
return objs[stackp-1];
else{
return null;
}
}
public int size(){
return stackp;
}
public boolean isEmpty(){
return stackp==0?true:false;
}
public static void main(String[] args){
Stack s = new Stack();
String[] months = {"January","February","March","April","May","June","July","August","September","October","November","December"};
for(int i =0;i<months.length;i++){
s.push(months[i]);
}
System.out.println(s.size()+" "+s.isEmpty());
for(int i =0;i<months.length;i++){
System.out.println( s.pop());
}
System.out.println(s.size()+" "+s.isEmpty());
//测试栈自动扩容
for(int i = 0;i<10;i++){
s.push(i+"");
}
System.out.println(s.size()+" "+s.isEmpty());
for(int i = 10;i<20;i++){
s.push(i+"");
}
System.out.println(s.size()+" "+s.isEmpty());
}
}
结果如图所示: