(一)栈 Stack

概念:栈也是一种线性结构,相比数组,栈对应的操作是数组的子集,只能从栈顶添加元素,也只能从栈顶取出元素。栈是一种后进先出的数据结构Last In First Out (LIFO)。

(二)栈的实现

从用户的角度看,并不关心具体底层实现,只需要支持操作即可, 故只要stack接口实现功能如下:

public interface Stack<E> {  //栈的接口
    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}

基于动态数组实现栈:

  • 声明
    public class ArrayStack<E> implements Stack<E>{  //基于动态数组的实现
    
        Array<E> array;
    
        public ArrayStack(int capacity){
            array = new Array<>(capacity);
        }
        public  ArrayStack(){
            array = new Array<>();
        }
    
        
    
        public int getCapacity(){  //只有动态数组才拥有获取容积的方法
            return array.getCapacity();
        }
    
    
        //栈的输出方式
        @Override
        public String toString(){
            StringBuilder res = new StringBuilder();
            res.append("Stack: ");
            res.append("[");
            for (int i = 0; i < array.getSize(); i++){
                res.append(array.get(i));
                if (i != array.getSize()-1)
                    res.append(", ");
            }
            res.append("] top");
            return res.toString();
        }
    
    }
    

     

  • 获取栈的大小
     @Override
        public int getSize(){
            return array.getSize();
        }
    

     

  • 判断栈是否为空
    @Override
        public boolean isEmpty(){
            return array.isEmpty();
        }

     

  • 往栈中添加元素e
     @Override
        public void  push(E e){
            array.addLast(e);
        }

     

  • 删除栈顶元素
     @Override
        public E pop(){
            return array.removeLast();
        }

     

  • 获取栈顶元素
    @Override
        public E peek(){
                return array.getLast();
        }

    (三)栈的复杂度分析 

 

  • ArrayStack<E>

     

    • int getSize();    O(1)
    • boolean isEmpty();    O(1)
    • void push(E e);    O(1)均摊
    • E pop();    O(1)
    • E peek();    O(1)

    (四)栈的应用

     

    • undo操作(撤销)- 编辑器
    • 系统调用栈 - 操作系统
    • 括号匹配 - 编译器
      //import java.util.Stack;
      
      
      public class Solution {
          public boolean isValid(String s){
              //Stack<Character>  stack = new Stack<>();//内部类
              ArrayStack<Character>  stack = new ArrayStack<>();//自己封装的类
      
              for (int i = 0; i < s.length(); i++){
                  char c = s.charAt(i);
      
                  if (c == '(' || c ==  '[' || c == '{'){
                      stack.push(c);
                  }else{
                      if (stack.isEmpty())
                          return false;
      
                      char topChar = stack.pop();
                      if (c == ')' && topChar != '(')
                          return false;
                      if (c == ']' && topChar != '[')
                          return false;
                      if (c == '}' && topChar != '{')
                          return false;
                  }
              }
      
              return stack.isEmpty();
          }
      }
      

       

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值