栈以及JAVA实现

后进先出

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

API

public class StackOfString//储存字符串的栈

	StackOfString()//创建对象
void push(String item)//入栈
String pop()//出栈
boolean isEmpty()//判断栈是否为空
int size()//栈中对象数目

示例

  • 空栈什么也没有
  • push('a')
graph BT 1(a,栈底,栈顶)
  • push('b')
graph TD 2(b,栈顶)==>1(a,栈底)
  • push('c')
graph TD 2(b)==>1(a,栈底) 3(c,栈顶)==>2
  • pop()
graph TD 2(b,栈顶)==>1(a,栈底)

链表栈

令栈顶指向栈底方向,保存指向栈顶元素的引用,可以提高入栈出栈的效率

Code by java

public class StackOfString {
    private class Node{//内部类
        String item;//存储的String对象
        Node next;//指向下一个Node的引用
    }
    private Node first=null;//初始栈顶对象为空
    public boolean isEmpty(){//判断栈是否为空,只要看first是否等于null
        return first==null;
    }
    public void push(String item){//添加元素
        Node oldfist=first;//拷贝first
        first=new Node();//令first指向新的Node
        first.item=item;//新Node存储的字符串为传入的参数
        first.next=oldfist;//令新的Node的next等于旧的first,也就是说令新的栈顶元素指向旧的栈顶元素
    }
    public String pop(){//删除元素
        String item=first.item;//拷贝栈顶元素存储的字符串
        first=first.next;//令栈顶元素指向它的下一个元素
        return item;
    }
}

数组栈

数组栈使用一个数组当作栈,好处是节省了空间,缺点是长度固定,有多余空间,而且有下标越界的风险,

public class FixedCapacityStackOfString {
    private String[] s;
    private int N=0;//N表示栈顶元素的下一个元素的下标
    public FixedCapacityStackOfString(int capacity){//根据传入的capacity确定字符串数组的长度
        s=new String[capacity];
    }
    public boolean isEmpty(){
        return N==0;//如果N等于0,即栈顶元素的下一个元素为0,则栈为空
    }
    public void push(String item){//入栈
        s[N++]=item;//注意!!这里的意思是,先给数组s的N下标位置赋值,然后N=N+1
    }
    public String pop(){
        String item=s[--N];//注意!!这里的意思是,先N=N-1,然后给数组s的N下标位置的字符串拷贝下来
        s[N]=null;//令栈顶元素的下一个元素为null,即使得垃圾回收器可以回收这部分空间
        return item;//返回拷贝的字符串
    }
}

猜你喜欢

转载自www.cnblogs.com/redo19990701/p/10704208.html