zoukankan      html  css  js  c++  java
  • 数据结构之栈

    基本概念

      栈(stack)又叫堆栈,是限制在表的一端进行插入和删除的线性表,按照后进先出(LIFO, Last In First Out)的原则操作数据,先进入的数据被压入栈底,最后的数据在栈顶。

      栈中元素为零时则为空栈,插入数据称为进栈(push),删除数据称为出栈(pop)。

      Java中提供栈的实现java.util.Stack<E> extends Vector<E>

    栈的模拟实现

     

     1 public class MyStack {
     2     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
     3 
     4     private Object[] elementData;
     5     private int elementCount;
     6 
     7     public MyStack () {
     8         elementData = new Object[10];
     9     }
    10 
    11     public MyStack(int minCapacity) {
    12         //带最小容量的初始化
    13         elementData = new Object[minCapacity];
    14     }
    15 
    16     //入栈元素
    17     public void push(Object item) {
    18         grow(elementCount + 1);
    19         elementData[elementCount++] = item;
    20     }
    21 
    22     //出栈元素
    23     public Object pop() {
    24         if (isEmpty()) throw new EmptyStackException();
    25         Object item = elementData[--elementCount];
    26         elementData[elementCount] = null;
    27         return item;
    28     }
    29 
    30     //容量是否需要扩容
    31     private void grow(int minCapacity) {
    32         if (minCapacity <= elementData.length) return;
    33         int newCapacity = elementData.length << 1 > MAX_ARRAY_SIZE ? MAX_ARRAY_SIZE : elementData.length << 1;
    34         System.out.println(String.format("grow:%s---->%s", elementData.length, newCapacity));
    35         elementData = Arrays.copyOf(elementData, newCapacity);
    36     }
    37 
    38     public boolean isEmpty() {
    39         return elementCount == 0;
    40     }
    41 
    42     public static void main(String[] args) {
    43         MyStack stack = new MyStack(3);
    44         //字段反转
    45         String strs = "其实我很在乎你 难道你就不明白";
    46         for (Character str : strs.toCharArray()) {
    47             stack.push(str);
    48         }
    49         while (!stack.isEmpty()) {
    50             System.out.print(stack.pop());
    51         }
    52         System.out.println("");
    53         //判断标签是否匹配
    54         strs = "<123(22[qd]5)>44>";
    55         for (char str : strs.toCharArray()) {
    56             if (str == '<' || str == '(' || str == '[') stack.push(str);
    57             if (str == '>' || str == ')' || str == ']') {
    58                 if (stack.isEmpty()) throw new RuntimeException("MyStack is Empty,But there has " + str);
    59                 char pop = (char) stack.pop();
    60                 if (str == '>' && pop != '<' || str == ')' && pop != '(' || str == ']' && pop != '[') throw new RuntimeException(String.format("%s not patch %s", pop, str));
    61             }
    62         }
    63     }
    64 }

    总结

      栈是一个概念上的工具  具体实现什么功能由我们自己决定

      栈通过提供限制性的访问方法push()和pop()使程序不易出错

  • 相关阅读:
    iOS下JS与OC互相调用(三)--MessageHandler
    在xcode6中使用矢量图(iPhone6置配UI)
    UITextField增加textDidChange回调功能
    IOS开发之格式化日期时间(转)
    ios中将事件同步到系统日历
    xcode中一些便捷用法@literals简写
    JavaScript
    fuzz for test of the Net::HTTP::GET
    perl6 中将 字符串 转成十六进制
    Net::HTTP 一次添加 cookie, body 发送post请求
  • 原文地址:https://www.cnblogs.com/ggza/p/9265632.html
Copyright © 2011-2022 走看看