Java_栈_队列

news2024/9/21 12:37:08

文章目录

  • 一、栈(Stack)
    • 1.概念
    • 2.栈的使用
    • 3.栈的模拟实现
      • 1、定义接口
      • 2、定义栈
      • 3、成员
      • 4、构造方法
      • 5、判断空间是否满 full
      • 6、入栈 push
      • 7、出栈 pop
      • 8、获取栈顶元素 peek
      • 9、获取栈中有效元素个数 size
      • 10、检测栈是否为空 empty
      • 完整代码
    • 4.练习
      • 1、有效括号
      • 2、逆波兰表达式求值
      • 3、栈的压入,弹出序列
      • 4、最小栈
    • 5. 概念区分
  • 二、队列
    • 1.概念
    • 2.队列的使用
    • 3.模拟实现
      • 1、成员
      • 2、入队列 offer
      • 3、出队列 poll
      • 4、获取队头元素 peek
      • 5、获取队列中有效元素个数 size
      • 6、检查队列是否为空 isEmpty
      • 完整代码
  • 三、其他队列
    • 1.循环队列
      • 设计循环队列
    • 2.双端队列
    • 3.练习


一、栈(Stack)

1.概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
在这里插入图片描述

2.栈的使用

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈
E pop()将栈顶元素出栈
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检查栈是否为空
    public static void main(String[] args) {
        Stack<Integer> s =new Stack<>();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println(s.size());
        System.out.println(s.peek());
        s.pop();
        System.out.println(s.pop());
        if(s.empty())
        {
            System.out.println("栈空");
        }
        else
        {
            System.out.println(s.size());
        }
    }

在这里插入图片描述

3.栈的模拟实现

在这里插入图片描述
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

1、定义接口

public interface IStack {
    void push(int x);
    int pop();
    int peek();
    int size();
    boolean empty();
    //判断是否满
    boolean full();
}

2、定义栈

public class MyStack implements IStack{
    @Override
    public void push(int x) {

    }

    @Override
    public int pop() {
        return 0;
    }

    @Override
    public int peek() {
        return 0;
    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public boolean empty() {
        return false;
    }
        @Override
    public boolean full() {
        return false;
    }
}

3、成员

存储数据的数组:

    private  int usedSize;

有效数据的个数:

    private  int usedSize;

默认大小:

    private  static  final  int DEFAULT_CAPACITY = 10;

4、构造方法

    public MyStack()
    {
        elem =new int[DEFAULT_CAPACITY];
    }

5、判断空间是否满 full

	@Override
    public boolean full() {
        if(usedSize ==elem.length)
        {
            return  true;
        }
        return false;
    }

6、入栈 push

    @Override
    public void push(int x) {
        if(full())
        {
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        elem[usedSize++] =x;
    }

7、出栈 pop

public class EmptyException extends RuntimeException{
    public EmptyException(String msg)
    {
        super(msg);
    }

}
-------------------------------------
    @Override
    public int pop() {
        if(empty())
        {
            //抛异常
            throw new EmptyException("栈空,出栈异常");
        }
        int old = elem[usedSize--];
        //如果是引用就需要置空
        return old;
    }

8、获取栈顶元素 peek

    @Override
    public int peek() {
        if(empty())
        {
            //抛异常
            throw new EmptyException("栈空");
        }
        return elem[usedSize-1];
    }

9、获取栈中有效元素个数 size

   @Override
    public int size() {
        return usedSize;
    }

10、检测栈是否为空 empty

    @Override
    public boolean empty() {
        return  usedSize==0;
    }

完整代码

public class EmptyException extends RuntimeException{
    public EmptyException(String msg)
    {
        super(msg);
    }

}

----------------------------
public interface IStack {
    void push(int x);
    int pop();
    int peek();

    int size();
    boolean empty();
    //判断是否满
    boolean full();
}

----------------------------------
import java.util.Arrays;

public class MyStack  implements IStack{
    private  int [] elem;
    private  int usedSize;
    private  static  final  int DEFAULT_CAPACITY = 10;
    public MyStack()
    {
        elem =new int[DEFAULT_CAPACITY];
    }

    @Override
    public boolean full() {
        if(usedSize ==elem.length)
        {
            return  true;
        }
        return false;
    }

    @Override
    public void push(int x) {
        if(full())
        {
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        elem[usedSize++] =x;
    }

    @Override
    public int pop() {
        if(empty())
        {
            //抛异常
            throw new EmptyException("栈空,出栈异常");
        }
        int old = elem[usedSize--];

        return old;
    }

    @Override
    public int peek() {
        if(empty())
        {
            //抛异常
            throw new EmptyException("栈空");
        }
        return elem[usedSize-1];
    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public boolean empty() {
        return  usedSize==0;
    }
}

4.练习

1、有效括号

有效括号
开一个栈,遇到左括号进栈,遇到右括号检查栈顶和遇到右括号是否匹配。

class Solution {
    public boolean isValid(String s) {
        Stack<Character> st = new Stack<>();
        for(int i = 0;i<s.length();i++)
        {
            char c =s.charAt(i);
            if(c=='('||c=='{'||c=='[')
            {
                st.push(c);
            }
            else
            {
                if(c==')'&&!st.empty())
                {
                    if(st.peek()!='(')
                    {
                        return false;
                    }
                    st.pop();
                }
                else if(c=='}'&&!st.empty())
                {
                    if(st.peek()!='{')
                    {
                        return false;
                    }
                    st.pop();
                }
                else if(c==']'&&!st.empty())
                {
                    if(st.peek()!='[')
                    {
                        return false;
                    }
                    st.pop();
                }
                else {
                    return false;
                }
            }
        }
        if(st.empty())
        {
            return true;
            
        }
        return  false;
    }
}

2、逆波兰表达式求值

逆波兰表达式
判断是操作数还是算符,如果是操作数转Int存在栈,不是就按算符进行运算。

class Solution {
    boolean isOperation(String s)
    {
        if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/"))
        {
            return  true;
        }
        return false;
    }

    public int evalRPN(String[] tokens) {
        Stack<Integer > st = new Stack<>();
        for(int i = 0;i<tokens.length;i++)
        {
            String s  =  tokens[i];
            if(isOperation(s))
            {
                int right  = 0;
                int left=0 ;
                if(st.size()>=2)
                {
                    right = st.pop();
                    left = st.pop();
                }

                if(s.equals("+"))
                {
                    st.push(left+right);
                }
                else if(s.equals("-"))
                {
                    st.push(left-right);
                }
                else if(s.equals("*"))
                {
                    st.push(left*right);
                }
                else if(s.equals("/"))
                {
                    st.push(left/right);
                }
            }
            else
            {
                int temp = Integer.parseInt(s);
                st.push(temp);
            }
        }
        return st.peek();
    }
}

3、栈的压入,弹出序列

栈的压入,弹出序列
先创建一个栈模拟压入,循环检查是否可以出栈,如果符合就出栈,不符合继续压入,直到全部压入但不能出栈,即为不符合弹出序列。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pushV int整型一维数组
     * @param popV int整型一维数组
     * @return bool布尔型
     */
    public boolean IsPopOrder (int[] pushV, int[] popV) {
        Stack<Integer> st = new Stack<>();
        int cur1= 0;
        int cur2 =0;
        int len = pushV.length;
        while(cur1<len||cur2<len)
        {
            if(cur1<len)
            {
                st.push(pushV[cur1]);
            }
            while(cur2<len)
            {
                if(!st.empty()&&st.peek()==popV[cur2])
                {
                    st.pop();
                    cur2++;
                }
                else {
                    if(cur1<len)
                    {
                        break;
                    }
                    else
                    {
                        return false;
                    }
                    
                }
            }
            cur1++;
        }
        return st.empty();
    }
}

4、最小栈

最小栈
开两个栈,一个存最小值的栈,一个就是普通的栈。在入栈的时候,判断存最小值的栈是否为空,空就同时入这两个栈,不为空就要比较存最小值的栈上面的值和新入的值,如果比最小栈的值还小或等于就同时入两栈,否则只入普通栈。

class MinStack {
    private  Stack<Integer> stack;
    private  Stack<Integer> minStack;



    public MinStack() {
        stack =new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if(minStack.empty())
        {
            minStack.push(val);
        }
        else
        {
            if(minStack.peek()>=val)
            {
                minStack.push(val);
            }
        }
    }

    public void pop() {
        if(minStack.peek().equals(stack.peek()))
        {
            minStack.pop();
        }
        stack.pop();
    }

    public int top() {
        return  stack.peek();
    }

    public int getMin() {

        return minStack.peek();
    }
}

5. 概念区分

栈、虚拟机栈、栈帧有什么区别?
栈:数据结构
虚拟机栈:JVM划分的一款内存而已
栈帧:调用方法的时候会在虚拟机当中给这个方法开辟一块内存

二、队列

1.概念

队列:只允许在一端进行插入数据操作,在另一端就进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾(Tail/Rear)
出队列:进行删除操作的一端称为队头(Head/Front)
在这里插入图片描述

2.队列的使用

在Java中,Queue是个接口,底层是通过链表实现的。
在这里插入图片描述

方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检查队列是否为空

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        System.out.println(queue.size());
        System.out.println(queue.peek());
        queue.poll();
        System.out.println(queue.isEmpty());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.isEmpty());

    }

在这里插入图片描述

3.模拟实现

1、成员

双向链表节点

    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;
        
        public ListNode(int val)
        {
            this.val =val;
        }
    }

头尾引用

    public ListNode head;
    public ListNode last;

节点个数

    public int size;

2、入队列 offer

   boolean offer(int val)
    {
        ListNode node = new ListNode(val);
        if(head==null)
        {
            head = node;
            last = node;
        }
        else
        {
            last.next = node;
            node.prev = last;
            last = node;
        }
        size++;
        return true;
    }

3、出队列 poll

public  int poll()
    {
        if(head==null){
            return -1;
        }
        int ret  = head.val;
        if(head.next==null)
        {
            head =null;
            last  = null;
            return ret;
        }
        head.next.prev = null;
        head = head.next;
        return ret;

    }

4、获取队头元素 peek

    public int peek()
    {
        if(head==null)
        {
            return -1;
        }
        return head.val;
    }

5、获取队列中有效元素个数 size

   public  int size()
    {
        return  size;
    }

6、检查队列是否为空 isEmpty

    public  boolean isEmpty()
    {
        return size==0;
    }

完整代码

package queuedemo;

import java.util.List;

public class MyLinkQueue  {
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

        public ListNode(int val)
        {
            this.val =val;
        }
    }
    public ListNode head;
    public ListNode last;
    public int size;
    boolean offer(int val)
    {
        ListNode node = new ListNode(val);
        if(head==null)
        {
            head = node;
            last = node;
        }
        else
        {
            last.next = node;
            node.prev = last;
            last = node;
        }
        size++;
        return true;
    }

    public  int poll()
    {
        if(head==null){
            return -1;
        }
        size--;
        int ret  = head.val;
        if(head.next==null)
        {
            head =null;
            last  = null;
            return ret;
        }
        head.next.prev = null;
        head = head.next;
        return ret;

    }
    public int peek()
    {
        if(head==null)
        {
            return -1;
        }
        return head.val;
    }

    public  int size()
    {
        return  size;
    }
    public  boolean isEmpty()
    {
        return size==0;
    }

}

三、其他队列

1.循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。
在这里插入图片描述
问题:


如何判断是空还是满?
解决空还是满有很多种方案:
1.使用usedSize进行记录
2.浪费一个空间来表示满
3.使用标记


如何从7下标来到0下标?
(队尾指针+1)%len

设计循环队列

设计循环队列


class MyCircularQueue {
    public int [] elem;
    int front = 0;
    int rear  = 0;


    public MyCircularQueue(int k) {
        elem = new int[k+1];
    }

    public boolean enQueue(int value) {
        if(isFull())
        {
           return  false; 
        }
        elem[rear] = value;
        rear = (rear+1)%elem.length;
        return true;
    }

    public boolean deQueue() {
        if(isEmpty())
        {
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }

    public int Front() {
        if(isEmpty())
        {
            return-1;
        }
        return elem[front];
    }

    public int Rear() {
        if(isEmpty())
        {
            return -1;
        }
        int temp = (rear-1+elem.length)%elem.length;
        return  elem[temp];
    }

    public boolean isEmpty() {
        return  front==rear;
    }

    public boolean isFull() {
        return  (rear+1)%elem.length==front;
    }
}

2.双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
Deque是一个接口,使用时必须创建LinkedList的对象。

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

3.练习

队列实现栈

class MyStack {
    Queue<Integer> que1;
    Queue<Integer> que2;


    public MyStack() {
        que1 = new LinkedList<>();
        que2 = new LinkedList<>();
    }

    public void push(int x) {
        if(que1.isEmpty()&&que2.isEmpty())
        {
            que1.offer(x);
        }
        else
        {
            if(que1.isEmpty())
            {
                que2.offer(x);
            }
            else
            {
                que1.offer(x);
            }
        }
    }

    public int pop() {
        int size ;
        if(que1.isEmpty())
        {
            size = que2.size();
            for(int i = 0;i<size-1;i++)
            {
                que1.offer(que2.poll());
            }
            return que2.poll();
        }
        else
        {
            size = que1.size();
            for(int i = 0;i<size-1;i++)
            {
                que2.offer(que1.poll());
            }
            return que1.poll();
        }
    }

    public int top() {
        if(que1.isEmpty())
        {
            int size = que2.size();
            for(int i = 0;i<size-1;i++)
            {
                que1.offer(que2.poll());
            }
            int ret =que2.poll();
            que1.offer(ret);
            return ret;
        }
        else
        {
            int size = que1.size();
            for(int i = 0;i<size-1;i++)
            {
                que2.offer(que1.poll());
            }
            int ret =que1.poll();
            que2.offer(ret);
            return ret;
        }
    }

    public boolean empty() {
        return  que2.isEmpty()&&que1.isEmpty();
    }
}

栈实现队列

class MyQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;

    public MyQueue() {
        stack1 = new Stack<>();//入队列
        stack2 = new Stack<>();//出列
    }

    public void push(int x) {
        stack1.push(x);
    }

    public int pop() {
        if(stack2.isEmpty())
        {
            while(!stack1.isEmpty())
            {
                stack2.push(stack1.pop());
            }
        }
        return  stack2.pop();
    }

    public int peek() {
        if(stack2.isEmpty())
        {
            while(!stack1.isEmpty())
            {
                stack2.push(stack1.pop());
            }
        }
        return  stack2.peek();
    }

    public boolean empty() {
        return stack2.isEmpty()&&stack1.isEmpty();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1441366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE Colab——如何利用Matplotlib在colab中进行图形制作

在colab中绘制图表 笔记本的一个常见用途是使用图表进行数据可视化。Colaboratory 提供多种图表工具作为 Python 导入,让这一工作变得简单。 Matplotlib Matplotlib 是最常用的图表工具包,详情请查看其文档,并通过示例获得灵感。 线性图 线性图是一种常见的图表类型,用…

LabVIEW网络测控系统

LabVIEW网络测控系统 介绍了基于LabVIEW的网络测控系统的开发与应用&#xff0c;通过网络技术实现了远程的数据采集、监控和控制。系统采用LabVIEW软件与网络通信技术相结合&#xff0c;提高了系统的灵活性和扩展性&#xff0c;适用于各种工业和科研领域的远程测控需求。 随着…

哈希表(Hash Table)-----运用实例【通过哈希表来管理雇员信息】(java详解) (✧∇✧)

目录 一.哈希表简介&#xff1a; 实例介绍&#xff1a; 类的创建与说明&#xff1a; 各功能图示&#xff1a; 1.class HashTab{ }; 2. class EmpLinkedList{ }&#xff1b; 3. class Emp{ }&#xff1b; 4.测试&#xff1a; 运行结果&#xff1a; 最后&#xff0c;完整…

springboot微信小程序uniapp学习计划与日程管理系统

基于springboot学习计划与日程管理系统&#xff0c;确定学习计划小程序的目标&#xff0c;明确用户需求&#xff0c;学习计划小程序的主要功能是帮助用户制定学习计划&#xff0c;并跟踪学习进度。页面设计主要包括主页、计划学习页、个人中心页等&#xff0c;然后用户可以利用…

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&…

CTF--Web安全--SQL注入之‘绕过方法’

一、什么是绕过注入 众所周知&#xff0c;SQL注入是利用源码中的漏洞进行注入的&#xff0c;但是有攻击手段&#xff0c;就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令&#xff0c;符号&#xff0c;甚至空格&#xff0c;会在反SQL机制中…

预测模型:MATLAB线性回归

1. 线性回归模型的基本原理 线性回归是统计学中用来预测连续变量之间关系的一种方法。它假设变量之间存在线性关系&#xff0c;可以通过一个或多个自变量&#xff08;预测变量&#xff09;来预测因变量&#xff08;响应变量&#xff09;的值。基本的线性回归模型可以表示为&…

Ps:窗口排列

Ps菜单&#xff1a;窗口/排列 Window/Arrange Photoshop 的“窗口/排列” Arrange子菜单中提供了多种方式来组织和查看打开的文档窗口&#xff0c;这在处理多个文档或比较图像时非常有用。 ◆ ◆ ◆ 常用操作方法与技巧 1、同文档双窗口处理法 将同一个图像显示在两个窗口中&…

The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装

本文记录了BFM算法代码在windows上的安装过程。 算法原网站&#xff1a;https://wasserstein-gradient-flows.netlify.app/ github&#xff1a;https://github.com/wonjunee/wgfBFMcodes 文章目录 FFTWwgfBFMcodesMATLABpython注 FFTW 官网/下载路径&#xff1a;https://ww…

备战蓝桥杯---动态规划(基础2)

本专题主要是介绍几个比较经典的题目&#xff1a; 假设我们令f[i]为前i个的最长不下降子序列&#xff0c;我们会发现难以转移方程很难写&#xff08;因为我们不知道最后一个数&#xff09;。 于是&#xff0c;我们令f[i]为以i结尾的最长不下降子序列&#xff0c;这样子我们就可…

Java基础知识练习题

1.对Java源文件进行编译操作的命令是&#xff08;B&#xff09; A.Java B.javac C.where is java D.javaw 2.下列命令中&#xff0c;用来运行Java程序的是&#xff08;A&#xff09;A.java B. javadoc C. jar D. javac 分析&#xff1a; 对Java源程序进行编译的命令是J…

Django的配置文件setting.py

BASE_DIR 项目路径&#xff1a;默认是已经打开的主项目路径 ​​​​​​​BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY 密钥 SECRET_KEY (dh&_fm2hfn9y)35!_6#$a7q%%^onoy#-a8x18r4(6*8f(aniDEBUG 帮助调试&#xff0c;默认…

gcore服务器设置root账号密码登录

这个厂商很奇怪&#xff0c;默认只能用centos用户与公钥登录&#xff0c;但是这样有时候很麻烦。 他默认开启了SELinux&#xff0c;和强制ssh密钥登录。 下面所有操作在root模式下进行 SELinux设置为兼容模式 setenforce 0vi /etc/selinux/config然后将文件中的SELINUXenfo…

JVM之GC垃圾回收

GC垃圾回收 如何判断对象可以回收 引用计数法 如果有对象引用计数加一&#xff0c;没有对象引用&#xff0c;计数减一&#xff0c;如果计数为零&#xff0c;则回收 但是如果存在循环引用&#xff0c;即A对象引用B对象&#xff0c;B对象引用A对象&#xff0c;会造成内存泄漏 可…

Java 学习和实践笔记(3)

安装和配置成功&#xff1a; 运行第一个程序时出现这个错误&#xff1a;javac不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 找到这篇文章看了下&#xff1a;javac 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。_javac 不是内部或外部…

安卓服务的常见问题,性能优化以及应用场景剖析

一、引言 在安卓开发中&#xff0c;服务&#xff08;Service&#xff09;扮演着至关重要的角色&#xff0c;它们在没有用户界面的情况下&#xff0c;为用户提供了长时间的后台任务执行能力。本文将探讨服务常见问题、优化策略、应用场景以及开发过程中应注意的事项。 二、应用场…

IP地址查询的应用与意义

在数字化时代&#xff0c;IP地址已成为连接我们与网络世界的纽带之一。通过IP地址查询&#xff0c;我们可以揭开数字世界的面纱&#xff0c;了解更多有关网站、用户和网络活动的信息。本文将探讨IP地址查询的应用场景、意义以及其在网络安全、个人隐私保护和地理定位服务中的作…

IT行业有哪些证书含金量高呢?

目录 引言&#xff1a; 一、 计算机网络类证书 二、 数据库管理类证书 三、 安全与信息技术管理类证书 四、 编程与开发类证书 五、 数据科学与人工智能类证书 六、结论&#xff1a; 悟已往之不谏&#xff0c;知来者犹可追 …

Netty连接通道中的Channel参数模型

ChannelOption(Channel中的连接参数) ChannelOption.SOBACKLOG ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数&#xff0c;服务端处理客户端连接请求是顺序处理的&#xff0c;所以同一时间只能处理一个客户端连接&#xff0c;多个客户端来的时候&…

机器学习11-前馈神经网络识别手写数字1.0

在这个示例中&#xff0c;使用的神经网络是一个简单的全连接前馈神经网络&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;。这个神经网络由几个关键组件构成&#xff1a; 1. 输入层 输入层接收输入数据&#xff0c;这里是一个 28x…