链式堆栈

来源:互联网 发布:蚁群优化算法 matlab 编辑:程序博客网 时间:2024/06/10 08:20

链式堆栈的存储结构

如同单链表结构,每个结点会有俩个区域,一个数据元素区(element),用来存放数据元素;另一个是指针区(next),用来构造数据元素之间的关系。

堆栈有两端:栈顶top,参与各种对堆栈的操作;另一端是栈底。

我们把链表的head端作为栈顶,另一端作为栈底。这样插入和删除栈顶元素时,无须遍历整个链表所以时间复杂度为O(1)。

由于堆栈的入栈和出栈都是固定在栈顶进行的,不存在单链表插入或删除操作允许在任意位置进行,所以,链式堆栈通常不带头结点。

44298c1d-2054-4dd5-be7d-1f7e4cd5f43f

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());
}
}
}


1 0