【学习记录】关于栈的实现、栈的几个小练习

本文介绍了栈这种数据结构,包括线性表的概念、栈的定义和特点,以及栈的顺序和非顺序映像实现。文章通过练习展示了栈的应用,如表达式逆序、括号匹配、表达式求值和用栈实现队列,提供了理解和运用栈的实例。
摘要由CSDN通过智能技术生成

栈的简单介绍

线性表

  1. 定义

线性表是具有相同特性数据元素的一个有限序列,
该序列中所含元素的个数叫做线性表的长度。

  1. 逻辑特性
    只有一个表头元素、没有前驱,只有一个表尾元素,没有后继。除表头和表尾外,其他元素只有一个直接前驱,也只有一个直接后继。
  2. 存储结构
    可以是顺序存储结构 也可以是链式存储结构

  1. 栈的定义

栈是一种只能在一端进行插入或删除的 操作受限的 线性表

  1. 栈的特点
    FILO
  2. 栈的数学性质
    当n个元素以某种顺序进栈,并且可以在任意时刻出栈时,所获得的元素排列的数目N恰好满足函数Catalan()的计算即 图来自这里->贴个链接
    在这里插入图片描述

栈的实现

自己实现

顺序映像

import java.util.EmptyStackException;

public class MyStack<E> {
   
    private static final int DEFAULT_CAPACITY = 10;
    private static final int MAX_CAPACITY = Integer.MAX_VALUE-8;

    //属性
    private E[] list;
    private int top = -1;

    //构造方法
    public MyStack(){
   
        list = (E[])new Object[DEFAULT_CAPACITY];
    }

    public MyStack(int initialCapacity){
   
        checkCapacity(initialCapacity);
        list = (E[])new Object[initialCapacity];
    }
    private void checkCapacity(int initialCapacity) {
   
        if(initialCapacity <0 || initialCapacity> MAX_CAPACITY){
   
            throw new IllegalArgumentException("initialCapacity = "+ initialCapacity );
        }
    }

    //方法
    public void push(E e){
   
        if(top==list.length-1){
   
            //如果需要扩容
            int newLength = calculateCapacity();
            grow(newLength);
        }
        list[++top] =e;
    }
    //计算容量
    private int calculateCapacity(){
   
        if(list.length ==MAX_CAPACITY) throw new RuntimeException("too long");
        int newLength = list.length+(list.length>>1);
        if(newLength<0 ||newLength>MAX_CAPACITY){
   
            newLength = MAX_CAPACITY;
        }
        return newLength;
    }
    private void grow(int newLength){
   
        E[] tempList = (E[])new Object[newLength];
        for (int i = 0; i <top ; i++) {
   
            tempList[i] = list[i];
        }
        list = tempList;
    }


    public E pop(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值