链式堆栈的存储结构
如同单链表结构,每个结点会有俩个区域,一个数据元素区(element),用来存放数据元素;另一个是指针区(next),用来构造数据元素之间的关系。
堆栈有两端:栈顶top,参与各种对堆栈的操作;另一端是栈底。
我们把链表的head端作为栈顶,另一端作为栈底。这样插入和删除栈顶元素时,无须遍历整个链表所以时间复杂度为O(1)。
由于堆栈的入栈和出栈都是固定在栈顶进行的,不存在单链表插入或删除操作允许在任意位置进行,所以,链式堆栈通常不带头结点。
Stack接口类设计
Stack.java
package 堆栈;
public interface Stack {
//入栈
public void push(Object obj)throws Exception;
//出栈
public Object pop() throws Exception;
//获取栈顶元素
public Object getTop()throws Exception;
//判断栈不为空
public boolean notEmpty();
}
Node结点类设计
Node.java
package 堆栈;
public class Node {
Object element;//数据域
Node next;//指针域
//头结点的构造方法
public Node(Node nextval){
this.next=nextval;
}
//非头结点的构造方法
public Node(Object obj,Node nextval){
this.element=obj;
this.next=nextval;
}
//获得当前结点的后继结点
public Node getNode(){
return this.next;
}
//获得当前的数据域的值
public Object getDate(){
return this.element;
}
//设置当前结点的指针域
public void setNext(Node nextval){
this.next=nextval;
}
//设置当前结点的数据域
public void setDate(Object obj){
this.element=obj;
}
//转换数据元素为String类型
public String toString(){
return this.toString();
}
}
测试类设计
LinListTest.java
package 堆栈;
public class LinStackTest {
public static void main(String[] args) {
LinStack mystack=new LinStack();
int test[]={1,2,3,4,5,6};
int n=6;
try{
for(int i=0;i<n;i++)
{
mystack.push(new Integer(test[i]));
}
System.out.println("当前栈顶元素为:"+mystack.getTop());
System.out.println("出栈元素序列为:");
while(mystack.notEmpty()){
System.out.print(mystack.pop()+"\t");
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}