第一章 根底

1.3.32 栈与队列交融的数据结构:链表实现

1.接口

public interface ISteque<T>{    /** * 进栈 * @param val 进栈元素 */ void push(T val); /** * 出栈元素 * @return 返回出栈元素 */ T pop(); /** * 进队 * @param val 进队元素 */ void enter(T val); /** * 获取元素个数 * @return 返回元素个数 */ int getCount(); /** * 返回队列是否为空 * @return 队列是否为空 */ boolean empty(); /** * 获取队列头 * @return 返回队列头部元素 */ T getFront(); /** * 获取栈顶元素 * @return 返回栈顶 */ T getTop();}

2.实现

/** * 链队列栈:循环链表示意 *///(push/pop)[h,5,4,3,2,1,2,3](enter)public class LinkSteque<T> implements ISteque<T>{    /** * 头节点 */ private Node<T> head; /** * 尾节点 */ private Node<T> p; /** * 元素个数 */ private int count; /** * 构造函数 */ public LinkSteque(){        this.head=new Node<T>();        this.head.next=head;        this.p=head; }    @Override public void push(T val) {        var t=new Node<T>(val,head.next);        this.head.next=t;        this.count++;        //保障尾节点始终指向链表尾        if(this.count==1)            this.p=t; }    @Override public T pop() {        if(this.empty())            throw new IndexOutOfBoundsException("队列空!");        var t=this.head.next;        var val=t.data;        this.head.next=t.next;        this.count--;       //空表的状况指向head就能够了       if(this.count==0)            this.p=this.head;        return val; }    @Override public void enter(T val)    {        var t=new Node<T>(val,p.next);        p.next=t;        p=t;        this.count++; }    @Override public int getCount() {        return this.count; }    @Override public boolean empty() {        return this.count==0; }    @Override public T getFront()    {        if(this.empty())            throw new IndexOutOfBoundsException("队列空!");        return this.p.data; }    @Override public T getTop()    {        if(this.empty())            throw new IndexOutOfBoundsException("队列空!");        return this.head.next.data; }}