所谓的链栈指的是采用链表为存储结构而实现的栈。
根据单链表的操作特征,选择其头部为栈的顶部,此时出栈,入栈都可以在O(1)完成。
带头结点的链表,结点的插入和删除都在其头结点之后进行。
不带头结点的链表,结点的插入和删除都在其第一个结点出进行。
而且栈是操作受限制的单链表,它对单链表的功能进行了阉割。如果对单链表理解透彻,则链栈不在话下。
如果对单链表有疑问请看另一篇博客。
https://blog.csdn.net/qq_40301026/article/details/86768703
废话少说,直接怼代码:
package 栈的实现;
/**
* 栈接口,定义了栈的主要操作
* @author Administrator
*
* @param <E>
*/
public interface Stack<E> {
//返回堆栈的大小
public int getSize();
//判断堆栈是否为空
public boolean isEmpty();
//数据元素e入栈
public void push(E e);
//栈顶元素出栈
public E pop();
//取栈顶元素
public E peek();
//清空栈
public void empty();
}
package 栈的实现;
public class Node<E> {
private E data; //数据域
private Node next; //指针域
public Node() {
this.data = data;
this.next = null;
}
public Node(E data) {
this.data = data;
this.next = null;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
package 栈的实现;
/**
* 链栈,用链表实现的栈。
* 头结点当做栈顶,尾结点当做栈底。所以操作只能发生在栈顶端
* @author Administrator
*
* @param <E>
*/
public class LinkStack<E> implements Stack{
private Node top;//栈顶(头指针)
private int size;//记录链表个数
public LinkStack() {
top = null;
size = 0;
}
public LinkStack(E data) {
top = null;
size = 0;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void push(Object e) {
Node newNode = new Node(e);
if(isEmpty()) {
top = newNode;
}
else {
newNode.setNext(top);;
top = newNode;
}
size++;
}
@Override
public E pop() {
if(isEmpty()) {
System.out.print("栈为空!");
return null;
}
E result = (E)top.getData();
Node t = top ;
top = top.getNext();
t.setNext(null);
size--;
return result;
}
@Override
public E peek() {
if(isEmpty()) {
System.out.print("栈为空!");
return null;
}
return (E)top.getData();
}
@Override
public void empty() {
top = null;
size = 0;
}
//输出整个栈
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
if(top==null) {
sb.append("栈为空!");
}else {
sb.append("(top)");
while(top!=null) {
sb.append(top.getData()+"-->");
top = top.getNext();
}
sb.delete(sb.length()-3, sb.length());
}
return sb.toString();
}
}