数据结构第五周 :(进制转换问题 + 迷宫自动行走问题 + 杨辉三角形 + 队列元素逆置 + 银行排队 + 整数划分问题 + 卡特兰数)

news2024/12/24 9:22:00

目录

  • 进制转换问题
  • 迷宫自动行走问题
  • 杨辉三角形
  • 队列元素逆置
  • 银行排队——队列
  • 整数划分问题
  • 买票问题——卡特兰数
  • 小兔的棋盘——卡特兰数

进制转换问题

【问题描述】根据课堂讲授,请用“顺序栈”解决进制转换问题,不采用顺序栈,不给分。
【输入形式】十进制数据和待转换的进制
【输出形式】转换后的数据
【样例输入】1348 8
【样例输出】2504
【样例输入】2608 16
【样例输出】A30

#include<stdio.h>
#define Stack_Size 50
typedef struct{
    int elem[Stack_Size];
    int top;
}SeqStack;

void InitStack(SeqStack * L){ //栈的初始化
    L->top = -1;
}

int PushStack(SeqStack * L,int e){ //进栈
    if(L->top == Stack_Size - 1){
        return 0;
    }
    else{
        L->top++;
        L->elem[L->top] = e;
        return 0;
    }
    return 0;
}

int PopStack(SeqStack * L,int * e){
    if(L->top == -1){
        return 0;
    }
    else{
        *e = L->elem[L->top];
        L->top--;
        return 0;
    }
    return 0;
}

void Metric(SeqStack * L,int oper,int base){
    while(oper != 0){
        PushStack(L,oper%base);
        oper = oper/base;
    }
    while(L->top != -1){
        int temp;
        PopStack(L,&temp);
        if(base <= 10){
            printf("%d",temp);
        }
        else{
            if(temp < 10){
                printf("%d",temp);
            }
            else{
                char a ='A'+(temp - 10);
                printf("%c",a);
            }
        }
    }
}
 int main(){
     SeqStack L;
     InitStack(&L);
     int oper,base;
     scanf("%d %d",&oper,&base);
     Metric(&L,oper,base);
     return 0;
 }

迷宫自动行走问题

【问题描述】有一个 10 x 10 的迷宫,起点是‘S’,终点是‘E’,墙是‘#’,道路是空格。一个机器人从起点走到终点。当机器人走到一个通道块,前面已经没有路可走时,它会按照右下左上的顺序在四个方向选择从而继续走。如果机器人能够过,则留下足迹‘*’,如果走不通,则留下标记‘!’。
在这里插入图片描述

#include<iostream>
#include<stdio.h>
using namespace std;
const int N = 150;

typedef struct position{//定义坐标位置类型
    int r, c;
}PosType;

typedef struct{// 定义堆栈元素的类型
    int ord; // 通道块在路径上的序号
    PosType seat; //通道块在迷宫中的坐标位置
    int di;  //此通道块走向下一通道块的方向
}SElemType;

typedef struct{// 定义迷宫类型
    char arr[10][11];
}MazeType;

typedef struct{//定义顺序栈
    SElemType elem[N];
    int top;
}SqStack;

void InitStack(SqStack * S){// 初始化栈
    S->top = -1;
}

void Fillmaze(MazeType &maze){//输入初始地图
    int i;
    for(i = 0; i < 10; i++){
        gets(maze.arr[i]); //可读入空格,回车表结束
    }
}

void DisplayMaze(MazeType &maze){ //输出地图
    int i;
    for(i = 0; i < 10; i++){
        cout<<maze.arr[i];
        cout<<endl;
    }
}

void Push(SqStack * S,SElemType e){ //进栈操作
    S->elem[++S->top] = e;
}

bool IsEmpty(SqStack * S){ //判空
    if(S->top == -1) return true;
    else return false;
}

void Pop(SqStack * S, SElemType &e){ //出栈
    if(IsEmpty(S))return ;
    else{
        e = S->elem[S->top--];
    }
}

bool Pass(MazeType &maze, PosType curpos){//判断能否通行
    if(maze.arr[curpos.r][curpos.c] == ' ' || maze.arr[curpos.r][curpos.c] == 'S' || maze.arr[curpos.r][curpos.c] == 'E')
        return true;
    else
        return false;
}

void FootPrint(MazeType &maze, PosType curpos){ //标记已走过的路
    maze.arr[curpos.r][curpos.c] = '*';
}

position NextPos(PosType curpos, int num){
    switch(num){
        case 1:curpos.c += 1;break;
        case 2:curpos.r += 1;break;
        case 3:curpos.c -= 1;break;
        case 4:curpos.r -= 1;break;
    }
    return curpos;
}

void MarkPrint(MazeType &maze, PosType seat){ //标记死路
    maze.arr[seat.r][seat.c] = '!';
}

void MazePath(MazeType &maze, PosType start, PosType end){ //迷宫路径
    SqStack S; //存放路径
    PosType curpos; //当前位置
    int curstep; //当前步数
    SElemType e; //栈元素
    InitStack(&S);
    curpos = start;
    curstep = 1;
    do{
        if(Pass(maze,curpos)){
            FootPrint(maze,curpos);
            e.di = 1;
            e.ord = curstep;
            e.seat = curpos;
            Push(&S,e);
            if(curpos.r == end.r && curpos.c == end.c) return ;
            curpos = NextPos(curpos,1);
            curstep++;
        }
        else{
            if(!IsEmpty(&S)){
                Pop(&S,e);
                while(e.di == 4 && !IsEmpty(&S)){
                    MarkPrint(maze,e.seat);
                    Pop(&S,e);
                }
                if(e.di < 4){
                    e.di++;
                    Push(&S,e);
                    curpos = NextPos(e.seat,e.di);
                }
            }
        }
    }while(!IsEmpty(&S));
    return ;
}
int main(){
    MazeType maze;
    PosType start;
    PosType end;
    Fillmaze(maze); //传递的是maze 的地址
    for(int i = 0; i < 10; i ++)
        for(int j = 0; j < 10; j ++)
        {
            if(maze.arr[i][j] == 'S')
            {
                start.c = i, start.r = j;
            }
            if(maze.arr[i][j] == 'E')
            {
                end.c = i, end.r = j;
            }
        }
    MazePath(maze,start,end);
    DisplayMaze(maze);
    return 0;
}

杨辉三角形

【问题描述】杨辉三角形的打印,请用循环队列实现。不采用“循环队列”,不给分。

【样例输入】

4
【样例输出】

1

1 1

1 2 1

1 3 3 1

#include<stdio.h>
#define Queue_Size 50

typedef struct{
    int elem[Queue_Size];
    int front;
    int rear;
}SeqQueue;

void InitQue(SeqQueue * L){ //队列的初始化
    L->front = 0;
    L->rear = 0;
}

int EnterQue(SeqQueue * L,int e){ //进队列
    if((L->rear + 1) % Queue_Size == L->front){
        return 0;
    }
    else{
        L->elem[L->rear] = e;
        L->rear = (L->rear + 1) % Queue_Size;
        return 0;
    }
    return 0;
}
int DeleteQue(SeqQueue * L,int * e){ //出队列
    if(L->front == L->rear){
        return 0;
    }
    else{
        *e = L->elem[L->front];
        L->front = (L->front + 1) % Queue_Size;
        return 0;
    }
    return 0;
}
int GetHead(SeqQueue * L,int * e){
    if(L->front == L->rear){
        return 0;
    }
    else{
        *e = L->elem[L->front];
        return 0;
    }
    return 0;
}

int IsEmpty(SeqQueue * L){
    if(L->rear == L->front){
        return 1;
    }
    else{
        return 0;
    }
}
void DisplayYh(SeqQueue * L,int r){ //实现杨辉三角的打印
    EnterQue(L,1);
    int i;
    for(i = 2; i <= r; i++){
        EnterQue(L,1);
        int j;
        int temp = 0;
        int head = 0;
        for(j = 1; j <= i - 2; j++){
            DeleteQue(L,&temp);
            printf("%d ",temp);
            GetHead(L,&head);
            EnterQue(L,temp + head);
        }
        DeleteQue(L,&temp);
        printf("%d ", temp);
        printf("\n");
        EnterQue(L,1);
    }
    while(!IsEmpty(L)){
        int temp = 0;
        DeleteQue(L,&temp);
        printf("%d ",temp);
    }
}
int main(){
    SeqQueue L;
    InitQue(&L);
    int r;
    scanf("%d",&r);
    DisplayYh(&L,r);
    return 0;
}

队列元素逆置

【问题描述】已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。需采用链式队列与栈(顺序或链式),否则不能得分。

【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素

【输出形式】输出队列的逆置

【样例输入】

3

1 2 3

【样例输出】

3 2 1

#include<stdio.h>
#include<stdlib.h>
typedef struct SNode{
    int data;
    struct SNode * next;
}LinkStackNode; //链式栈的节点
typedef LinkStackNode* LinkStack;

typedef struct QNode{
    int data;
    struct QNode * next;
}LinkQueueNode; //链式队列节点
typedef struct{
    LinkQueueNode * front;
    LinkQueueNode * rear;
}LinkQueue;

void InitStack(LinkStack * S){//链栈的初始化
    *S = (LinkStack)malloc(sizeof(LinkStackNode));
    (*S)->next = NULL;
}

int PushStack(LinkStack top,int e){//链栈的进栈操作
    LinkStackNode * temp;
    temp = (LinkStack)malloc(sizeof(LinkStackNode));
    if(temp == NULL){
        return 0;
    }
    else{
        temp->data = e;
        temp->next = top->next;
        top->next = temp;
        return 0;
    }
    return 0;
}

int PopStack(LinkStack top,int * e){
    if(top->next == NULL){
        return 0;
    }
    else{
        LinkStackNode * temp;
        temp = top->next;
        top->next = temp->next;
        *e = temp->data;
        free(temp);
        return 0;
    }
    return 0;
}

void InitQueue(LinkQueue * Q){ //链队列的初始化
    Q->front = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    if(Q->front != NULL){
        Q->rear = Q->front;
        Q->front->next = NULL;
    }
}

int EnterQueue(LinkQueue * Q,int e){ //链队列的进队列操作
    LinkQueueNode * temp;
    temp = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    if(temp != NULL){
        temp->data = e;
        temp->next = NULL;
        Q->rear->next = temp;
        Q->rear = temp;
        return 0;
    }
    return 0;
}

int DeleteQueue(LinkQueue * Q,int * e){//链队列的出队列操作
    LinkQueueNode * temp;
    if(Q->rear != Q->front){
        temp = Q->front->next;
        *e = temp->data;
        Q->front->next = temp->next;
        free(temp);
    }
    return 0;
}

int main(){
    LinkStack top = NULL;
    InitStack(&top);
    LinkQueue Q;
    InitQueue(&Q);
    int QueLen;
    scanf("%d",&QueLen);
    int flag;
    flag = QueLen;
    while(flag--){
        int QueData;
        scanf("%d",&QueData);
        EnterQueue(&Q,QueData);
    }
    flag = QueLen;
    while(flag--){
        int temp;
        DeleteQueue(&Q,&temp);
        PushStack(top,temp);
    }
    flag = QueLen;
    while(flag--){
        int temp = 0;
        PopStack(top,&temp);
        EnterQueue(&Q,temp);
        printf("%d ",temp);
    }
    return 0;
}

银行排队——队列

【问题描述】

我们大多都有在银行排队的经历,唉,那坑爹的排队啊!现在就让我们来算算我们这些客户平均需要等多久吧。
每天刚开始时银行会开m个窗口来为我们total个客户办理业务,当有客户需要办理业务时,先选择可以办理业务的窗口,如果有多个窗口可以办理业务就选择空闲时间最长的窗口,如果有多个窗口空闲的时间一样长,则选择序号小的窗口办理业务。假设我们每个人来到的时间和办理业务所需要的时间(为了简化问题,采用整数表示时间)都知道了。现在请你算算我们平均需要等待多久呢?请用顺序队列或链式队列来完成本题。

【输入形式】

有多组测试数据,每组数据开始有两个正整数m(<20)和total(<200),后面有total对整数,对应客户先后到来的时间以及办理业务所需的时间。

【输出形式】

平均等待的时间,保留两位小数。

【样例输入】

2 6 1 3 4 1 5 3 9 2 13 4 13 3
3 14 0 3 2 2 2 4 5 4 7 2 11 3 12 3 12 4 12 1 13 3 15 4 19 1 22 3 23 2
2 5 0 6 0 5 0 6 7 1 7 2

【样例输出】

0.00
0.29
1.20

【提示】

题目中选择办理的窗口有三个状态,实际上从序号自小到大查找可以最早办理业务的窗口就已经满足上述三个状态了。若客户的到来时间相同,现实中并不知道该用户需要多久处理完任务,所以遵循先来的先服务原则。

【要求】

请用顺序队列或链式队列来完成,否则不得分。

#include<bits/stdc++.h>
using namespace std;
int m,tot,a,b;
template<class T> class Pque{
protected:
    struct node{
        T data;
        node* next;
        node():next(NULL){}
    };
    node* head;
    int Size;
public:
    Pque():Size(0){
        head=new node;
    }
    ~Pque(){
        head=head->next;
        while(head) {
            node* t=head;
            head=head->next;
            delete t;
        }
    }
    void push(T t){
        node* p=head;
        for(;p->next&&p->next->data<t;p=p->next);
        node* n=new node;
        n->data=t;n->next=p->next;p->next=n;
        ++Size;
    }
    T pop(){
        node* p=head->next;
        head->next=p->next;
        T t=p->data;
        delete p;--Size;
        return t;
    }
    T front(){return head->next->data;}
    int size(){return Size;}
};

int main(){
    while(cin>>m){
        Pque<int> win;cin>>tot;
        double wt=0;
        for(int i=0;i<tot;++i){
            cin>>a>>b;
            while(win.size()&&win.front()<=a)win.pop();
            if(win.size()<m) win.push(a+b);
            else{
                int k=win.front();
                wt+=k-a;
                win.pop();
                win.push(k+b);
            }
        }
        cout<<fixed<<setprecision(2)<<wt/tot<<endl;
    }
    return 0;
}

整数划分问题

【问题描述】根据课堂讲授,编程实现某整数的划分的输出

【样例输入】

6
【样例输出】

6

5+1

4+2

4+1+1

3+3

3+2+1

3+1+1

2+2+2

2+2+1+1

2+1+1+1+1

1+1+1+1+1+1

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int N = 110;

int res[N];
int n;

void dfs(int rest, int pre, int cnt)
{
    if(rest == 0)
    {
        for(int i = 0; i < cnt - 1; i ++)
        {
            cout<< res[i] << '+';
        }
        cout << res[cnt - 1] << endl;
        return;
    }
    for(int i = pre; i >= 1; i --)
    {
        if(i > rest) continue;
        res[cnt] = i;
        dfs(rest - i, i, cnt + 1);
    }
}
int main()
{
    int n;
    cin >> n;
    dfs(n, n, 0);
    return 0;
}

买票问题——卡特兰数

【问题描述】

m个人只有50元钱,n个人只有100元整钱,票价50元/人。现在售票厅没钱,只有50元钱的人可以不用找钱顺利买票,而拿着100元整钱的人只有在前面有50元的情况下才能买票,因为只有这样,才能找零50元。所有的人能否买票和排队的方式有一定关系,问使得所有的人能够顺利买票的排队方式有多少种?

【输入形式】

m和n,当输入0 0则结束输入

【输出形式】

先输出:Test #i:期中i代表第几组测试数据;再输出排队方式的种数

【样例输入】

3 0

3 1

3 3

0 0

【样例输出】

Test #1:

6

Test #2:

18

Test #3:

180

#include<iostream>
using namespace std;
long long zh(int m, int n){
    int i;
    long long r1 = 1;
    long long r2 = 1;
    for(i = m; i > 0; i--){
        r1 *= n;
        n--;
        r2 *= i;
    }
    return r1/r2;
}
long long jc(int m){
    int i;
    long long r = 1;
    for(i = m; i > 0; i--){
        r *= i;
    }
    return r;
}

long long fun(int m, int n){
    if(n == 0){
        return jc(m);
    }
    long long r1 = zh(m, m + n) * jc(m) * jc(n);
    long long r2 = zh(m + 1, m + n) * jc(m) * jc(n);
    return r1 - r2;
}
int main(){
    int flag = 0;
    while(1){
        flag++;
        int m,n;
        cin>>m>>n;
        if(m == 0 && n == 0){
            break;
        }
        else{
            long long res;
            res = fun(m,n);
            cout<<"Test #"<<flag<<':'<<endl;
            cout<<res<<endl;
        }
    }
    return 0;
}

小兔的棋盘——卡特兰数

【问题描述】

小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!

【输入形式】

每次输入一个数n(1<=n<=35),当n等于-1时结束输入。

【输出形式】

对于每个输入数据输出路径数,具体格式看Sample。

【样例输入】

1

3

12

-1

【样例输出

1 1 2

2 3 10

3 12 416024

#include<stdio.h>
#include<iostream>
using namespace std;
int LC(int num,int cent){
    int i;
    long long r1 = 1;
    long long r2 = 1;
    for(i = cent; i > 0; i--){
        r1 *= num;
        num--;
        r2 *= i;
    }
    return r1/r2;
}
int main(){
    int flag = 0;
    while(1){
        flag++;
        int n;
        scanf("%d",&n);
        if(n == -1) break;
        long long r1 = LC(2 * n,n);
        long long r2 = LC(2 * n,n - 1);
        long long res = 2 * (r1 - r2);
        cout<<flag<<" "<<n<<" "<<res<<endl;
    }
    return 0;
}

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

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

相关文章

前端屏幕录制工具 + 录制<video>标签内容

一、录制的实现思路 1.开始录制、停止录制、下载视频 2.Blob介绍 3.概念 var mediaRecord //用于录制视频 var mediaStream //视频流 var videoBuffer [] //保存的视频数据二、屏幕录制工具 下载地址&#xff1a; https://chrome.google.com/webstore/detail/tampermonkey…

Linux- 系统随你玩之--文本处理三剑客--grep继任者awk

文章目录1、sed概述1.1、 与vim等编辑器的区别&#xff1a;1.2、sed工作原理1.3 、sed数据处理原理1.4 、正则表达式概念2、 sed语法和常用选项2.1、语法&#xff1a;2.2、sed常用内部命令2.3、参数&#xff1a;3、 sed 正则表达式&#xff08;定位&#xff09;3.1 、数字定址…

管理机密(RH294)

在ansible中有一个命令行工具ansible-vault可用于创建 编辑 加密 解密 查看文件举个栗子ansible-vaultcreate filenameNew Vault password&#xff1a; #输入密码Confirm New Vault password&#xff1a; #确认密码也可以使用别的方法 比如创建一个密码文件ansible-vaultcreate…

互联网开发必读Git工具利器-《30天精通Git版本控管》中文版免费分享

本书介绍在软体开发领域&#xff0c;对原始码进行版本控管是非常重要的一件事&#xff0c;有别于Subversion或TFS这类集中式版本控管系统&#xff0c;Git是一套分散式版本控管系统&#xff0c;并带来许多版本控管上的各种优势与解决传统集中式版本控管的缺失&#xff0c;例如支…

Spring Cloud_Hystrix断路器

目录一、概述1.分布式系统面临的问题2.是什么3.能干嘛4.官网资料5.Hystrix官宣&#xff0c;停更进维二、Hystrix重要概念1.服务降级Fallback2.服务熔断Breaker3.服务限流Flowlimit三、hystrix案例1.构建2.高并发测试3.故障现象和导致原因4.上诉结论5.如何解决&#xff1f;解决的…

面试_Selenium常见问题

1.selenium 工作原理 1.对于每一条Selenium脚本&#xff0c;一个http请求会被创建并且发送给浏览器的驱动 2.浏览器驱动中包含了一个HTTP Server&#xff0c;用来接收这些http请求 3.HTTP Server接收到请求后根据请求来具体操控对应的浏览器 4.浏览器执行具体的测试步骤 5.浏览…

Smali语法小记

Smali语法小记 介绍 在执行 Android Java 层的代码时&#xff0c;其实就是 Dalvik(ART) 虚拟机&#xff08;使用 C 或 C 代码实现&#xff09;在解析 Dalvik 字节码&#xff0c;从而模拟程序的执行过程。 自然&#xff0c;Dalvik 字节码晦涩难懂&#xff0c;研究人员们给出了…

通过 eShopOnContainers 项目学习一下微服务

这里是项目地址 https://github.com/dotnet-architecture/eShopOnContainers, 这是微软创建的一个基于 .NET 平台的微服务架构的示例应用程序&#xff0c;里面基本上市面上主流的时髦的技术都用上了。 因为涉及的内容比较多&#xff0c;所以我们只简单查看一下微服务的代码实现…

信息抽取命名实体识别和关系抽取)

信息抽取的定义为&#xff1a;从自然语言文本中抽取指定类型的实体&#xff0c;关系、事件等事实信息。并形成结构化数据输出的文本处理技术。 信息抽取是从文本数据中抽取特定信息的一种技术&#xff0c;文本数据由医学具体的单位构成&#xff0c;例如&#xff0c;句子、段落、…

JavaWeb—Vue的简单介绍

1 Vue介绍 概述 Vue是一套构建用户界面的渐进式前端框架。只关注视图层&#xff0c;并且非常容易学习&#xff0c;还可以很方便的与其它库或已有项目整合。通过尽可能简单的API来实现响应数据的绑定和组合的视图组件。 数据渲染 数据库 --JDBC–> java程序 --http协议–>…

《MySQL实战45讲》——学习笔记23 “binlogredolog 的写入机制/组提交机制“

本篇主要介绍数据的可靠性有关的知识&#xff0c;包括binlog的写入机制和redolog的写入机制&#xff0c;通过了解这些机制从而可以在MySQL的IO性能瓶颈上做些优化&#xff1b;前文介绍了MySQL在可靠性、性能相关的概念&#xff0c;包括WAL技术、redolog与binlog、2阶段提交、ch…

阿里云图标使用 (symbol 引用方式)

阿里云图标网址: https://www.iconfont.cn/ 一、登录注册 这个简单&#xff0c;就不说了 二、给当前项目找图库 2.1、添加项目 2.2、寻找图标添加入库 添加入库 2.3、打开入库 的图标添加到指定项目 添加到当前项目 1 2 三、项目使用图标 ( symbol 引用方式) 3.1、下…

《HelloGitHub》第 82 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01;简介HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。https://github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Pyth…

Studio One6有哪些新功能及系统配置要求介绍

Studio One6全新版本上线记录、生产、混合、掌握和执行所有操作。从工作室到舞台&#xff0c;Studio One6以易用为核心&#xff0c;是您的创意合作伙伴。当你准备好登上舞台时&#xff0c;Studio One就在那里。只有Studio One从最初的灵感到完整的制作&#xff0c;最终混音到精…

一个数码管显示0-F

数码管的一种是半导体发光器件&#xff0c;数码管可分为七段数码管和八段数码管&#xff0c;区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP&#xff08;decimal point&#xff09;&#xff0c;其基本单元是发光二极管。七段数码管是一类价格便宜使用简…

VuePress 搭建结合GitHub Pages CI

简介 VuePress 是尤雨溪&#xff08;vue.js 框架作者&#xff09;4月12日发布的一个全新的基于 vue 的静态网站生成器&#xff0c;实际上就是一个 vue 的 spa 应用&#xff0c;内置 webpack&#xff0c;可以用来写文档。详见 VuePress中文网 其实类似的建站工具有很多&#x…

Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors

文章目录线程池(重点)线程池介绍实现线程池的方式方式一: 实现类ThreadPoolExecutorThreadPoolExecutor构造器的参数线程池处理Runnable任务线程池处理Callable任务方式二: Executors工具类创建线程池线程池(重点) 线程池介绍 什么是线程池? 线程池就是一个可以复用线程的技…

以太网报文详解

以太网数据帧格式 以太网链路传输的数据包称做以太帧&#xff0c;或者以太网数据帧。在以太网中&#xff0c;网络访问层的软件必须把数据转换成能够通过网络适配器硬件进行传输的格式。 以太帧的工作机制 当以太网软件从网络层接收到数据报之后&#xff0c;需要完成如下操作&am…

模拟实现stack queue/dequeue/适配器/优先级队列/仿函数

⭐前言&#xff1a;学习C的STL&#xff0c;我们不仅仅要要求自己能够熟练地使用上层语法&#xff0c;我们还必须要求自己了解其底层原理&#xff0c;不需要了解得太深入&#xff0c;但一定得知道我们写出的各种代码后面&#xff0c;究竟采用了哪种设计思想&#xff0c;为什么要…

口碑巨制《流浪地球2》,再燃中国科幻电影新高度!

2019年&#xff0c;中国本土科幻电影《流浪地球》以炸裂之势吸引一众目光。上映26天&#xff0c;票房突破45亿&#xff0c;强势开启中国科幻电影的元年。如今时隔4年&#xff0c;《流浪地球2》再度登陆春节档&#xff0c;票房口碑双丰收&#xff0c;上映四天票房破13亿、淘票票…