栈(JAVA描述)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LiuXudongHnu/article/details/68096952

        栈是一种特殊的线性表,栈中的数据元素以及数据元素间的逻辑关系与线性表相同,两者区别在于:线性表的插入和删除操作可以在表的任意位置进行,而栈的插入和删除操作只允许在表的尾端进行。其中,允许进行插入删除操作的叫做栈顶、另一端叫做栈底。因此,栈又称为先进后出的线性表(LIFO)。因为栈是一种特殊的线性表,所以根据存储结构也可以把栈分为顺序(顺序存储结构)栈和链(链式存储结构)栈。定义栈接口代码如下:

public interface IStack {
	
	public void clear();          //将一个已经存在的栈置为空栈
	
	public boolean isEmpty();     //判断一个栈是否为空
	
	public int length();          //返回栈中数据元素的个数
	
	public Object peek();         //读取栈顶的元素,若栈为空,返回null
	
	public void push(Object x) throws Exception;  //将数据元素压入栈
	
	public Object pop();          //删除并返回栈顶元素
	
}
        顺序栈:与顺序表一样,顺序栈也可以使用数组来进行实现。由于入栈和出栈都只能在栈顶进行,因此我们加上一个top变量来指示栈顶元素。代码如下:

public class SqIStack implements IStack{

	private Object[] listItem;             //定义数组,用来存放数据元素
	
	private int top;                       //在非空栈中,top始终指向栈顶元素的下一个存储位置,当栈为空时,top的值为0
	
	public SqIStack(int maxsize){
		top=0;                             //初始化为top为0
		listItem=new Object[maxsize];      //为栈分配maxsize个存储单元
	}
	
	@Override
	public void clear() {     
		// TODO Auto-generated method stub
		top=0;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return top==0;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		return top;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if(top!=0){
			return listItem[top-1];
		}else {
			return null;
		}
	}

	@Override
	public void push(Object x) throws Exception {
		// TODO Auto-generated method stub
		if(top==listItem.length){
			throw new Exception("栈已满");
		}else{
			listItem[top++]=x;
		}
	}

	@Override
	public Object pop() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			return null;
		}else{
			return listItem[--top];
		}
	}

}

链栈的操作:由于在栈中,入栈和出栈操作只能在栈顶进行,不存在在单链表的任意位置进行插入和删除操作的情况,所以在栈中不需要设置头结点,直接将栈顶元素放在单链表的首部称为首结点。而只需要设置一个top指向栈顶元素结点即可。

public class Node {
	
	public Object data;  //存放节点值
	
	public Node next;    //后继节点的引用
	
	public Node(){       //无参数的构造器
		this(null,null);
	}
	
	public Node(Object data){            //带一个参数时的构造函数
		this(data,null);
	}

	public Node(Object data,Node next){  //两个参数时的构造函数
		this.data=data;
		this.next=next;
	}
	
}
public class LinkStack implements IStack{

	public Node top;
	
	@Override
	public void clear() {
		// TODO Auto-generated method stub
		top=null;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return top==null;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		Node pNode=top;
		int lenth=0;
		while(pNode!=null){
			pNode=pNode.next;
			lenth++;
		}
		return lenth;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if(top!=null){
			return top.data;
		}else
			return null;
	}

	@Override
	public void push(Object x) throws Exception {
		// TODO Auto-generated method stub
		Node p=new Node(x);                    //构造新结点
		p.next=top.next;                       //新结点称为栈顶结点
		top=p; 
	}

	@Override
	public Object pop() {
		// TODO Auto-generated method stub
		if(top==null){
			return null;
		}else{
		    Node p=top;
		    top=top.next;
		    return p.data;
		}
	}

}


猜你喜欢

转载自blog.csdn.net/LiuXudongHnu/article/details/68096952