栈和队列简单总结

Posted z啵唧啵唧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和队列简单总结相关的知识,希望对你有一定的参考价值。

文章目录

栈和队列

  • 站和队列都是线性表,都是基于List基础上实现的
  • 线性表就是元素按照一条"直线排列起来",线性表这个结构中,一次添加单个元素,常见的线性表有:数组,链表,字符串,栈和队列
  • 常见的非线性结构有:树,图
  • 站和队列是一个再使用上更加严格的线性表,规定了添加元素和输出元素的规则
  • 动态数组,链表,可以在任意位置进行插入和删除

栈的简介
  • 栈是一个先进后出,后进先出的线性表,支持三个核心的操作:入栈(push),出栈(pop),返回栈顶元素(peek)

  • 向栈中依次添加元素:123,输出的顺序为321

栈的常见应用
  • 无处不在的撤销操作
  • 浏览器的前进后退操作
  • 二叉树的四种遍历方式的底层就是使用的是栈和队列
自己实现一个栈
  • 栈是一个线性表,底层可以使用数组,也可以使用链表
  • 基于数组实现的栈叫做顺序栈添加或者删除元素实际上就是在数组的尾部进行的,时间复杂度为o(1),栈顶实际上就是数组的末尾
  • 基于链表实现的栈叫做链栈
package com.zb.day5;

import java.util.ArrayList;
import java.util.List;

/**
 * 基于数组实现的栈
 */
public class myStack<E> 
    //当前栈的元素个数
    private int size;
    //实际上我们的这个栈基于动态数组进行实现
    private List<E> list = new ArrayList<>();

    /**
     * 给栈中添加元素
     * @param val
     */
    public void push(E val)
    
        list.add(val);
        size++;
    

    /**
     * 将栈顶元素出栈
     */
    public void pop()
    
        list.remove(size-1);
        size--;
    

    /**
     * 获得栈顶元素
     * @return
     */
    public E peek()
    

        return list.get(size-1);
    

    /**
     * 判断栈是否为空
     * @return
     */
    public boolean isEmpty()
    
        return list.isEmpty();
    

    /**
     * 判断栈中是否包含指定的元素
     * @param val
     * @return
     */
    public boolean contains(E val)
    
        return list.contains(val);
    

    public int getSize() 
        return size;
    

    public void setSize(int size) 
        this.size = size;
    

    @Override
    public String toString() 
        String ret = "[";
        for (int i = 0;i<size;i++)
        
            if (i!=size-1)
            
                ret +=list.get(i)+"->";
            
        
        ret+=list.get(size-1)+"] top";
        return ret;
    



  • 测试一下

    package com.zb.day5;
    
    public class myStackTest 
        public static void main(String[] args) 
            myStack<Integer> stack = new myStack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            System.out.println(stack);
            System.out.println(stack.isEmpty());
            System.out.println(stack.contains(3));
            System.out.println(stack.contains(4));
            int len = stack.getSize();
            for (int i = 0 ;i<len;i++)
            
                System.out.println(stack.peek());
                stack.pop();
            
            System.out.println(stack);
        
    
    

队列

  • 队列FIFO在队首出队在队尾入队,遵循先进先出,后进后出的原则
  • 在现实生活中比如食堂排队打饭
队列的两种实现方式
  • 基于数组实现的队列->顺序队列,但是由于队列是队尾入队(数组尾部添加元素),队首出队(数组头部删除元素),数组在尾部添加元素十分的方便,但是数组想要删除头部的元素确是十分的困难.
  • 基于链表实现的队列->链式队列,链表头插尾插都相对更加容易一些
基于链表实现的队列
package com.zb.day5;

import java.util.LinkedList;
import java.util.List;

public class myQueue<E> 
    //当前队列当中的元素个数
    private int size=0;
    List<E> list = new LinkedList<>();

    /**
     * 元素入队操作,从队尾进行入队
     * @param val
     */
    public void offer(E val)
    
        list.add(val);
        size++;
    

    /**
     * 元素出队操作,在队首进行出队
     */
    public void poll()
    
        list.remove(0);
        size--;
    

    /**
     * 返回队首元素
     * @return
     */
    public E peek()
    
        return list.get(0);
    

    /**
     * 判断队列是否是一个空队列
     * @return
     */
    public boolean isEmpty()
    
        return list.isEmpty();
    

    /**
     * 判断队列是否存在指定元素
     * @param val
     * @return
     */
    public boolean contains(E val)
    
       return list.contains(val);
    

    @Override
    public String toString() 
        int len = size-1;
        String ret = "[";
        while(len>=0)
        
            if(len!=0)
            
                ret+=list.get(len)+"->";
            else
                ret+=list.get(len);
            
            len--;
        
        return ret+="] top";
    

    public int getSize() 
        return size;
    



  • 测试一下

    package com.zb.day5;
    
    public class myQueueTest 
    
        public static void main(String[] args) 
            myQueue<Integer> queue = new myQueue<>();
            queue.offer(1);
            queue.offer(2);
            queue.offer(3);
            System.out.println(queue);
            System.out.println(queue.isEmpty());
            System.out.println(queue.contains(3));
            System.out.println(queue.contains(10));
            int len = queue.getSize();
            for (int i = 0;i<len;i++)
            
                System.out.println(queue.peek());
                queue.poll();
            
    
        
    
    

以上是关于栈和队列简单总结的主要内容,如果未能解决你的问题,请参考以下文章

队列栈和链表

面试准备之刷题总结:栈和队列

数据结构 - 栈和队列

栈和队列

栈和队列

栈和队列简单总结