【正确答案】
【答案解析】可以采用数组与链表这两种方法来实现栈。
下面给出用数组实现栈的代码:
impoa java.util.Arrays;
public class MyStack<E>{
private Object[]stack;
private int size;//数组中存储元素的个数
public MyStack(){
stack=new Object[10]; //初始长度为10
}
//判断堆栈是否为空
public boolean isEmpty(){
return size==0;
}
public E peek(){
if(isEmpty()){
return null;
}
return(E)stack[size-1];
}
public E pop(){
E e=peek();
stack[size-1]=null;
size--;
return e;
}
public E push(E item){
ensureCapacity(size+1); //检查容量
stack[size++]=item;
return item;
}
//判断数组器是否已满,若已满,则扩充数组空间
private void ensureCapacity(int size){
int len=stack.length;
if(size>len){//数组已满
int newLen=10; //每次数组扩充的容量
stack=Arrays.eopyOf(stack, newLen);
}
}
public static void main(String[]args){
MyStack<Integer>s=new MyStack<Integer>();
s.push(1);
s.push(2);
System.out.println("栈中元素个数:"+s.size);
System.out.println("栈顶元素为:"+s.pop());
System.out.println("栈顶元素为:"+s.pop());
}
}
下面给出采用链表的方式实现栈的代码。
class Node<E>{
Node<E>next=null;
E clata;
public Node(E data){this.data=data;}
}
public class Stack<E>{
Node<E>top=null;
public boolean isEmpty(){
return top==null;
}
public void push(E data){
Node<E>newNode=new Node<E>(data);
newNode.next=top;
top=newNode;
}
public E pop(){
if(this.isEmpty())
return null;
E data=top.data;
top=top.next;
return data;
}
public E peek(){
if(isEmpty()){
return null;
}
return top.data;
}
}
需要注意的是,上述的实现不是线程安全的。若要实现线程安全的栈,则需要对入栈和出栈等操作进行同步,在此就不详细介绍了。