栈的特点
- 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。
栈是一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
- 栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
- 栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
链栈的特点
- 物理结构不连续和逻辑结构连续
链栈的java实现
package stack;
/**
* ================================数据结构说明:========================================
*
* 名称:链栈
*
* 特征:
* 1. 物理结构不连续和逻辑结构连续
*
* 主要方法:
* 1. init:初始化顺序表
* 2. destroy:销毁栈
* 3. clear:清空栈中的元素
* 4. length:获取数据表长度
* 5. getTop: 获取栈顶元素
* 6. pop: 退栈操作
* 7. isEmpty:判断顺序栈是否为空
* 8. print:打印顺序栈中的元素
*
* ======================================================================================
*/
/**
* @author 叶清逸
* @date 2018年7月31日下午12:40:35
* @version 1.0
* @project stack
*/
public class LinkStack implements Stack {
private SLElement top ;
private int LENGTH ;
/**
* @see stack.Stack#init()
* @explain init方法: 初始化
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:30:31
*/
@Override
public void init() {
top = new SLElement() ;
top.setData(null);
top.setNext(null);
LENGTH = 0 ;
}
/**
* @see stack.Stack#destroy()
* @explain destroy方法: 销毁栈
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:42:24
*/
@Override
public void destroy() {
if(top == null){
System.out.println("错误!栈未初始化");
return ;
}
top = null ;
LENGTH = 0 ;
}
/**
* @see stack.Stack#clear()
* @explain clear方法: 清空栈
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:43:00
*/
@Override
public void clear() {
if(top == null){
System.out.println("错误!栈未初始化");
return ;
}
top.setNext(null);
}
/**
* @see stack.Stack#isEmpty()
* @explain isEmpty方法:判断栈是否为空,若为空返回true否则返回false
* @return 栈的长度
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:49:38
*/
@Override
public boolean isEmpty() {
if(LENGTH == 0)
return true ;
else
return false;
}
/**
* @see stack.Stack#length()
* @explain length方法: 获取栈的大小
* @return 栈的大小
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:50:41
*/
@Override
public int length() {
if(top == null){
System.out.println("错误!栈未初始化");
return -1;
}
return LENGTH ;
}
/**
* @see stack.Stack#getTop()
* @explain getTop方法:
* @return Object 返回栈顶元素
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:52:53
*/
@Override
public Object getTop() {
if(top == null){
System.out.println("错误!栈未初始化");
return null ;
}
return top.getData() ;
}
/**
* @see stack.Stack#push(java.lang.Object)
* @explain push方法: 压栈操作
* @param elem 要压入的元素
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:53:37
*/
@Override
public void push(Object elem) {
if(top == null){
System.out.println("错误!栈未初始化");
return ;
}
SLElement e = new SLElement(elem,top) ;
top = e ;
LENGTH++ ;
}
/**
* @see stack.Stack#pop()
* @explain pop方法: 退栈操作
* @return 已退栈的元素
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:56:44
*/
@Override
public Object pop() {
if(top == null){
System.out.println("错误!栈未初始化");
return null;
}
SLElement elem = top ;
top = top.getNext() ;
LENGTH-- ;
return elem.getData() ;
}
/**
* @see stack.Stack#print()
* @explain print方法: 打印栈(从栈顶到栈底)
* @throws
* @author 叶清逸
* @date 2018年7月31日 下午2:59:54
*/
@Override
public void print() {
if(top == null){
System.out.println("错误!栈未初始化");
return ;
}
SLElement p = top ;
while(p.getNext() != null){
System.out.print(p.getData() + " ");
p = p.getNext() ;
}
System.out.println();
}
}
class SLElement implements Element{
private Object data ;
private SLElement next ;
public SLElement() {
super();
}
public SLElement(Object data, SLElement next) {
super();
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public SLElement getNext() {
return next;
}
public void setNext(SLElement next) {
this.next = next;
}
}