数据结构实战java实现栈

栈的实现

在之前的myarraylist和mylinkedlist基础上都可以很方便的实现栈。

栈的特点

先进后出

栈的作用

  • 实现递归,调用函数
  • 将复杂的计算操作转化为简单的操作(后缀表达式)

学习计算机基本要素可以深入了解栈的作用。

栈顺序实现

直接使用arraylist的add方法加一个代表栈指针的变量即可。

栈链表实现

由于栈不需要索引所以只需要使用单链表即可

public class MyStack<AnyType> { 

    private int topstack;
    private StackNode<AnyType> stackMarker;

    //此内部类构建单向链表中的每一个元素
    private static class StackNode<AnyType> {
        public StackNode( AnyType d, StackNode<AnyType> p ) {
            data = d;
            prev = p;
        }

        public AnyType data;
        public StackNode<AnyType> prev;

    }
    //初始化MyStack对象
    public MyStack() {
        clear();
    }
    //创建链表的头元素,
    public void clear() {
        stackMarker = new StackNode( null, null);       
        topstack = -1;   
    }
    //判断栈是否为空栈    
    public boolean isEmpty() {
        return topstack == -1;
    }
    //返回现在栈中有几个元素
    public int size() {
        return topstack + 1;
    }
    //压入栈中
    public void push( AnyType value) {
        StackNode<AnyType> oldStack = stackMarker;
        StackNode<AnyType> newStack = new StackNode( value, oldStack );
        stackMarker = newStack;
        topstack++;        
    }
    //弹出栈
    public AnyType pop( ) {
        if ( isEmpty() )
            throw new IndexOutOfBoundsException();
        topstack--;
        StackNode<AnyType> popStackNode = stackMarker;
        AnyType data = popStackNode.data;
        stackMarker = stackMarker.prev;
        return data;               
    }

}

测试代码

    //测试代码
    public static void main(String[] args) {
        MyStack test = new MyStack();
        test.push("你好");
        test.push("世界");
        test.push(1);
        test.push(2);
        test.push(3);
        for (int i =0; test.size() != 0; i++ )
            System.out.println(test.pop());
    }

运行结果

3
2
1
世界
你好

写法分析

链表栈可以不担心栈溢出的问题,顺序栈则要考虑这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值