栈是限制插入和删除只能在一个位置上进行的表,该位置就是栈顶top。基本操作有push和pop。由于栈是一个表,任何实现表的方式都能实现栈。一种是单链表。一种是数组。

一、主要应用

  1. 平衡符号,编译器检查程序的语法错误。
  2. 后缀表达式的计算
  3. 中缀到后缀的转换
  4. 方法调用

一般使用一个栈来去除递归。并且编译器在转变成汇编语言时会去除递归。

二、栈在java中的使用

//新建一个栈
stack<Integer> stack = new Stack<Integer>();

具有的函数

//构造方法  
stack():创建一个空栈
//其它函数
empty()
peek():查看栈顶对象,但不移除
pop():移除栈顶对象
push()
search(Object o):返回对象在堆栈中的位置,以1为基数

三、用数组实现一个栈

    //顺序栈
    public class SequenceStack implements Stack {

        Object[] stack; //对象数组(栈用数组来实现)
        final int defaultSize = 10; //默认最大长度
        int top; //栈顶位置(的一个下标):其实可以理解成栈的实际长度
        int maxSize; //最大长度

        //如果用无参构造的话,就设置默认长度
        public SequenceStack() {
            init(defaultSize);
        }

        //如果使用带参构造的话,就调用指定的最大长度
        public SequenceStack(int size) {
            init(size);
        }

        public void init(int size) {
            this.maxSize = size;
            top = 0;
            stack = new Object[size];
        }

        //获取栈顶元素
        @Override
        public Object peek() throws Exception {
            // TODO Auto-generated method stub
            if (empty()) {
                throw new Exception("堆栈为空!");
            }

            return stack[top - 1];
        }

        //判断栈是否为空
        @Override
        public boolean empty() {
            // TODO Auto-generated method stub
            return top == 0;
        }

        //出栈操作
        @Override
        public Object pop() throws Exception {
            // TODO Auto-generated method stub
            if (empty()) {
                throw new Exception("堆栈为空!");
            }
            top--;

            return stack[top];
        }

        //入栈操作
        @Override
        public void push(Object obj) throws Exception {
            // TODO Auto-generated method stub
            //首先判断栈是否已满
            if (top == maxSize) {
                throw new Exception("堆栈已满!");
            }
            stack[top] = obj;
            top++;
        }
    }

四、Stack源码实现的主要函数

public
class Stack<E> extends Vector<E> {
    /**
     * Creates an empty Stack.
     */
    public Stack() {
    }

    public E push(E item) {
        addElement(item);

        return item;
    }

    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

    public boolean empty() {
        return size() == 0;
    }

    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值