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();}
/**
* 链队列栈: 循环链表示意
*/
//(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;
}
}