IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 玩转JAVA---------栈和队列 -> 正文阅读

[Java知识库]玩转JAVA---------栈和队列

栈(Stack)

概念

栈(Stack)继承于Vector,底层是一个数组
栈是先进后出的数据结构

1、判断进出栈的顺序

答案是c
答案是C

2、计算机通过栈进行计算

中缀表达式——>后缀表达式
(加括号,移符号,去括号)

把数字放入栈中
遇到算术运算符,从栈中提出两个数字运算,先右后左(针对 - 和 /)
运算结果放入栈中
如此循环,直到栈为空结束,得到计算结果

在这里插入图片描述
在这里插入图片描述
XABCD-*E/+=

使用栈

Stack<Integer> stack = new Stack<>();
栈常用的方法
public E push(E item)将一个元素入栈
public synchronized E pop()删除栈顶元素并返回此元素
public synchronized E peek()得到栈顶元素
public boolean empty()判断栈是否为空
public synchronized int search(Object o)查找指定元素,返回[ size()-下标(下标是数组下标)],即返回元素的排名(栈顶元素为1,向下元素依次加1)
        Stack<Integer> stack = new Stack<>();
        stack.push(10); //入栈
        stack.push(20);
        stack.push(30);
        stack.push(40);
        System.out.println(stack);

        int ret = stack.pop();  //40
        System.out.println(ret);

        int ret1 = stack.peek();  //30
        System.out.println(ret1);

        boolean flg = stack.empty();  //false
        System.out.println(flg);

        System.out.println(stack);
        int index = stack.search(20); //返回下标,30-1 , 20-2 ,10-3
        System.out.println(index);

用顺序表实现一个栈

public class MyStack<T> {
    private T[] elem;  //数组
    private int top;     //数组中可以存放元素的下标,也叫栈顶指针

    public MyStack() {
        this.elem =(T[])new Object[10];
    }

    public void push(T element) {
        //1、先判断栈是否是满的,满了扩容
        //2、添加元素
        if (this.top == this.elem.length) {
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }
        this.elem[top] = element;
        top++;
//      this.elem[top++]=element;

    }

    public T pop(){
        if(empty()){
           throw new UnsupportedOperationException("栈为空");
        }
        T ret=this.elem[this.top-1];
        this.top--;            //真正的删除
//      int ret=this.elem[--top];
        return ret;
    }

    public T peek(){
        if(empty()){
            throw new UnsupportedOperationException("栈为空");
        }
        T ret=this.elem[this.top-1];
        return ret;
    }

    public boolean empty(){
        return this.top==0;
    }

    @Override
    public String toString() {
        return "MyStack{" +
                "elem=" + Arrays.toString(elem) +
                ", top=" + top +
                '}';
    }

}

在这里插入图片描述
话说,栈能否通过单向链表实现呢?
当然可以啦!!!
只是
如果入栈用尾插法,入栈和出栈时间复杂度O(n);即使用last指向栈顶元素,入栈时间复杂度可变为O(1),但是出栈需要使用栈顶元素的前一个元素,时间复杂度仍为O(n);双向链表可以使入栈和出栈的时间复杂度均为O(1)
如果入栈用头插法,有head指向头元素,入栈和出栈的时间复杂度均为O(1),

队列(Queue)

概念

底层是链表
先进先出,即进到队头而且从队头出
在这里插入图片描述

使用队列

Queue<Integer> queue = new LinkedList<>();
//或 LinkedList<Integer> linkedList = new LinkedList<>();
队列的常用方法
boolean offer(E e)将一个元素入队
E poll()获取队头元素,但不删除
E peek()删除队头元素(出队),返回此元素
抛出异常返回特殊值
入栈boolean add(E e)boolean offer(E e)
出栈E remove()E pop()
获取栈顶元素 E element()E peek()

通过链表实现一个队列

用first指向队头;用last指向队尾
进队尾插;出队头删
时间复杂度都为O(1)
实现方法时注意判断对列是否为空

class Node{
    private int val;
//可以不用改成public
    private Node next;
    public Node(int val){
        this.val=val;
    }
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
}
public class MyQueue {
    private Node first;
    private Node last;
    //尾插入队
    public void offer(int val){
        Node node = new Node(val);
        //先判断是否为空
        if(empty()){
            this.first=node;
            this.last=node;
        }else{
            this.last.setNext(node);
            this.last=node;
        }
    }
//出队
    public int poll(){
        if(empty()) {
            throw new UnsupportedOperationException("队列为空!!");
        }
        int ret = this.first.getVal();
        this.first = this.first.getNext();
        return ret;
        
    }
//得到队头元素,不删除
    public int peek(){
        if(empty()){
            throw new UnsupportedOperationException("队列为空!!!");
        }
        return this.first.getVal();
    }

    public boolean empty(){
        return this.first==null;
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:25:20  更:2021-08-24 15:26:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 12:44:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码