1..结点类
package edu.tcu.soft;
/*链栈结点数据结构*/
public class Node<T> {
private T data; // 结点的值
private Node<T> nextNode; //下一个结点的引用
public T getData() {
return data;
}
public Node<T> getNextNode() {
return nextNode;
}
public void setData(T data) {
this.data = data;
}
public void setNextNode(Node<T> nextNode) {
this.nextNode = nextNode;
}
public Node() {
}
public Node(T data, Node<T> nextNode) {
super();
this.data = data;
this.nextNode = nextNode;
}
}
2.链栈类
package edu.tcu.soft;
public class LinkStack<T> {
private Node<T> top;// 存放栈顶结点
private int size;// 存放链栈中元素个数
public LinkStack() {
top = new Node<T>(null, null);
}
// 入栈
public void push(T data) {
Node<T> node = new Node<T>(data, top.getNextNode());
top.setNextNode(node);
size++;
}
// 出栈
public T pop() {
if (top.getNextNode() == null) {
System.out.println("链栈中没有元素!");
return null;
} else {
Node<T> node=top.getNextNode();
top.setNextNode(node.getNextNode());
//释放原栈顶元素的引用
// oldTop.setNextNode(null);
size--;
return node.getData();
}
}
// 获取栈顶元素
public T getTop(){
if(top.getNextNode()!=null)
return top.getNextNode().getData();
else
return null;
}
// 判空操作
public String isEmpty(){
if(top.getNextNode()==null){
return "链栈为空栈";
}else{
return "链栈为非空栈";
}
}
//获取链栈的元素的个数
public int size(){
return size;
}
}
3.测试类
package edu.tcu.soft;
public class Test {
public static void main(String[] args) {
LinkStack<Integer> stack=new LinkStack<>();
System.out.println("入栈操作");
stack.push(9);
System.out.println("查看链栈的长度");
System.out.println("链栈的长度:"+stack.size());
System.out.println("查看栈顶元素"+stack.getTop());
System.out.println("移除栈顶元素:"+stack.pop());
System.out.println("查看栈是否为空:"+stack.isEmpty());
stack.push(10);
System.out.println("查看当前的栈顶元素:"+stack.getTop());
System.out.println("链栈的长度:"+stack.size());
System.out.println("查看当前的栈顶元素:"+stack.getTop());
}
}
总结:
实现顺序栈和链栈的所有基本操作算法都只需要常数时间,因此唯一可以比较的空间性能。初始时顺序栈必须确定一个固定的长度,所以有存储元素个数限制和空间浪费的问题。链栈没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每一个对象都有下一个对象的引用,从而产生结构性开销。所以当栈的使用过程中元素个数变化较大时,用链栈适宜,相反则采用顺序栈。