栈——链栈

所谓的链栈指的是采用链表为存储结构而实现的栈。

根据单链表的操作特征,选择其头部为栈的顶部,此时出栈,入栈都可以在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();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值