数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

文章目录

  • 栈和队列上机实验
    • 1.要求
    • 2.栈的实现(以顺序栈为例)
    • 3.队列的实现(以顺序队列为例)
    • 4.利用栈实现进制转换
    • 5.利用队列解决约瑟夫环问题
    • 6.全部源码
      • Stack.h
      • Queue.h
      • test.cpp

栈和队列上机实验

1.要求

  1.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。

  2.利用循环队列实现.约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人出圈;他的下一个人又从1开始报数,数到k的那个人出圈;依此规律重复下去,直到圆桌周围的人只剩最后一个。模拟该游戏,并输出出圈顺序。

            

2.栈的实现(以顺序栈为例)

  栈的基本概念:

  栈(stack)是一种数据结构,它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  
  栈的基本结构和初始化:

  我们定义了一个名为Stack的模板类,用于实现可以存储各种数据类型的栈的数据结构。我们创建了三个Stack的成员函数:_base、_top 和 _size。

  _base: 它作为动态分配的栈内存的起始位置。

  _top:表示栈顶的位置。 在构造函数中,它被初始化为指向InitStackSize个新分配的SElemType元素的数组的末尾。

  _size: 是一个整数,用于表示栈的当前大小,即栈中元素的数量。 在构造函数中,它被初始化为InitStackSize。

  构造函数: Stack()函数负责初始化这个栈。 它首先为_base和_top分配InitStackSize个SElemType大小的内存,并将_size设置为InitStackSize。

  析构函数: ~Stack()函数负责清理和释放由Stack对象持有的内存。 它首先删除_base指向的数组,然后将_base和_top设置为0,将_size设置为0。这是为了确保在对象销毁后,不会错误地引用任何内存地址。

  注意:数据结构的的实现是很灵活的,对于栈而言,顺序结构和链式结构都可以实现,当然,_base,_top等成员变量也可以设计成整型或者是指针,只要满足该数据类型的特征,就都可以设计。

template<class T>
class Stack
{//构造函数Stack(){_base = _top = new SElemType[InitStackSize];_size = InitStackSize;}//析构函数~Stack(){delete[] _base;_top = _base = nullptr;_size = 0;}private:SElemType* _base, * _top;int _size;
};

  
  入栈和扩容操作:

  我们现在实现栈最基本的入栈操作,首先创建一个Push函数,它用于将一个元素压入栈中。如果栈满了,它会进行扩容操作。

  如果 _top 指针和 _base 指针之间的距离等于 _size(这意味着栈已经满了),那么将进行扩容操作。扩容操作包括创建一个新的数组(大小为原数组的两倍),然后复制原数组的元素到新数组中。 最后,更新 _base 指针指向新数组,_top 指针指向新数组的末尾,_size 变为新数组的大小。

  入栈操作,如果栈没有满,那么将 val 的值赋给 _top 指针所指向的位置,并将 _top 指针向前移动一位。 最后,_size 加一。

void Push(const SElemType& val)
{//栈满,扩容if (_top - _base == _size){//转移栈中的元素SElemType* newbase = new SElemType[_size * 2];for (int i = 0; i < _size; i++){newbase[i] = _base[i];}//删除原来栈中元素delete[] _base;_base = newbase;_top = newbase + _size;_size *= 2;}//入栈操作*_top = val;_top++;_size++;
}

  
  出栈操作:

  我们现在实现出栈操作,先创建一个名为Pop的函数,用于从栈中删除并返回栈顶元素。

  函数声明:Pop(SElemType& e) 是一个函数,它接受一个类型为 SElemType 的引用作为参数,命名为 e。引用的使用意味着我们可以在函数内部修改传入的参数,而不仅仅是它的副本。

  栈检查:在函数体中,首先检查栈的大小(_size),如果为0,说明栈是空的。 此时,会打印一条消息 ‘该栈为空,无法删除\n’ 并结束函数。出栈操作:如果栈非空,我们执行出栈操作。首先,将栈顶元素的值赋给参数 e。然后,将 _top 指针向前移动一位(即向下移动到栈顶元素的前一个位置),因为我们已经取出了栈顶元素。最后,_size 减一,因为栈中少了一个元素。

  这样,Pop 函数就能够从栈中删除并返回栈顶元素,同时还能处理空栈的情况。

void Pop(SElemType& e)
{if (_size == 0){cout << "该栈为空,无法删除\n";return;}//出栈操作e = *_top;_top--;_size--;
}

  栈测试:

在这里插入图片描述

            

3.队列的实现(以顺序队列为例)

  队列的基本概念:

  队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。 和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

  
  队列的基本结构和初始化:

  我们定义了一个名为Queue的C++模板类,用于实现可以存储不同数据类型的队列数据结构。我们创建了四个成员变量:

  _base:这是一个指向队列元素的指针。

  _front:这是队列的头部索引。

  _rear:这是队列的尾部索引。

  _capacity:这是队列的容量。

  构造函数:Queue的构造函数初始化了队列的基础元素数组。将队列的前端和后端索引设为0,并将队列的容量设为 ‘QueueSize’。这个 ‘QueueSize’ 应该是在类外部定义的常数,表示队列的最大容量。

  析构函数:当 Queue 对象被销毁时,析构函数将被调用。 这个析构函数删除了队列的基础元素数组,将 _base 设为 nullptr,将队列的前端和后端索引设为0,并将队列的容量设为0。这是为了释放队列占用的内存,并重置队列的状态。

template<class T>
class Queue
{
public://构造函数Queue(){_base = new QElemType[QueueSize];_front = _rear = 0;_capacity = QueueSize;}//析构函数~Queue(){delete[] _base;_base = nullptr;_front = _rear = 0;_capacity = 0;}private:QElemType* _base;int _front, _rear;int _capacity;
};

  
  入队和扩容操作:

  我们现在实现队列的入队函数,用于将一个元素添加到队列中。

  if (_front == (_rear + 1) % _capacity): 这是一个判断语句,它检查队列是否已满。这里的_front,_rear和_capacity可能是队列的私有成员变量。其中_front代表队列的第一个元素的位置,_rear代表队列的最后一个元素的位置(下一个插入元素的位置),_capacity代表队列的最大容量。如果_front等于_rear + 1 % _capacity,这意味着队列的下一个位置(_rear)已经被占用了,即队列已满。

  扩容:QElemType* newqueue = new QElemType[_capacity * 2];: 如果队列已满,这段代码会创建一个新的、容量是原队列两倍的队列。for (int i = _front; i < _rear; i++): 这个循环复制原队列中从_front到_rear - 1的所有元素到新的队列中。delete[] _base;: 释放原队列所占用的内存。_base = newqueue;: 将新队列的指针赋值给_base,这样原队列的指针就指向了新的队列。然后更新队列的容量即可。

  入队: 就在队列的最后一个位置插入新的元素。更新队列的最后一个位置即可。如果增加后超过了队列的容量,则取模(%)操作会将其限制在队列的范围内(0到_capacity-1)。

  顺序队列的一些操作和判断:

  空队列判断条件: rear == front

  尾指针的移动方式: rear = (rear+1)%QueueSize

  头指针的移动方式: front=(front+1)%QueueSize

  判断队列满: front == (rear+1)%QueueSize

在这里插入图片描述

void Push(const QElemType& val)
{//判断队列是否已满if (_front == (_rear + 1) % _capacity){QElemType* newqueue = new QElemType[_capacity * 2];for (int i = _front; i < _rear; i++){newqueue[i] = _base[i];}//删除原来栈中元素delete[] _base;_base = newqueue;_capacity *= 2;}_base[_rear] = val;//如果想让队列超过QueueSize的长度,一定要%_capacity;_rear = (_rear + 1) % _capacity;
}

  
  出队操作:

  实现队列出队操作我们先判断队列是否为空, 它检查队列的前端(_front)和后端(_rear)是否相等。如果相等,这意味着队列为空,没有元素可以删除。则输出信息直接返回,不执行任何操作。

  如果队列不为空,这行代码将_base数组中索引为_front的元素赋值给引用参数e。这意味着,当你调用Pop函数时,通过引用参数e来获取被出队的元素。当元素被删除后,前端位置需要更新以指向下一个未被删除的元素。 这里使用模运算符(%)来确保前端位置在超过队列容量时回到队列的开始位置。

void Pop(QElemType& e)
{if (_front == _rear){cout << "队列为空,无法删除\n";return;}e = _base[_front];_front = (_front + 1) % _capacity;
}

  队列测试:

在这里插入图片描述

            

4.利用栈实现进制转换

  我们可以利用栈将一个十进制数转换为另一个进制数:

  函数首先声明了两个字符串变量s和table,以及两个整型量m和n。table是一个包含16个字符的字符串,用于表示16进制的数。

  然后函数要求用户输入要转换的十进制数m和目标进制数n。函数检查如果输入的数m为0,则直接输出0,因为0在任何进制下都等于0。

  接下来如果输入的数m为负数,则将其转换为正数,并标记flag为true,表示这个数之前是负数。然后我们创建了一个名为st的堆,利用堆的性质,可以存储转换后的字符。在while循环中,函数将输入的数m不断模以目标进制数n,取出每次的余数,将余数对应的字符从table中取出,并压入堆栈st中。 同时,更新输入的数m为原来的数除以目标进制数。

  如果之前标记过flag为true(即输入的数是负数),则在堆栈中压入一个’-'字符。最后,函数将堆栈中的所有字符取出并拼接到字符串s中,然后输出这个字符串。这个字符串就是转换后的数。

void Decimal_Conversion()
{string s, table = "0123456789ABCDEF";int m, n;cout << "请输入:m为输入的数,n为转换的进制\n";cout << "m=";cin >> m;cout << "n=";cin >> n;bool flag = false;if (m == 0) cout << "0";//如果是负数,则转成正数,并标记一下if (m < 0){m = 0 - m;flag = true;}Stack<char> st;//按进制换算成对应的字符添加到swhile (m){st.Push(table[m % n]);m /= n;}if (flag){st.Push('-');}while (!st.Empty()){s += st.Top();st.Pop();}cout << s << endl;
}

  测试:
  
10转化为2进制:1010

在这里插入图片描述  
150转化为8进制:226

在这里插入图片描述
  
100001转化为16进制:186A1

在这里插入图片描述
在这里插入图片描述
            

5.利用队列解决约瑟夫环问题

  我们可以利用队列解决约瑟夫环问题。约瑟夫环:描述了一组共m个人围成一圈,从第n个人开始报数,报到m的人出列,然后从下一个人重新开始报数,直到所有的人都出列的问题。

  首先,函数向用户提示输入约瑟夫环的两个人数m和n。然后,使用队列que来模拟人们围成的圆圈。初始时,将1到m的人依次入队。使用一个计数器count,从1开始计数,每次循环都会增加1,直到达到目标n。

  如果计数器count小于目标n,表示当前人不需要出列,将队头元素取出(即这个人),从队列中删除(模拟这个人跳过),然后将这个元素重新插入队尾(这个人回到圆圈的尾部)。 然后,计数器count加1,为下一次循环做准备。

  如果计数器count等于目标n,表示当前人需要出列,将队头元素取出并打印(这个人是出列的人),然后从队列中删除这个元素(模拟这个人完全出列),然后将计数器count重置为1,继续下一轮循环。

  当队列为空时,说明所有的人已经出列,退出循环。

void Joseph_Exchange()
{cout << "约瑟夫环问题:请输入一共有m人,第n人出局:\n";int m, n;cout << "m=";cin >> m;cout << "n="; cin >> n;//填入队列中Queue<int> que;for (int i = 1; i <= m; i++){que.Push(i);}//计数器,计到目标就输入int count = 1;while (!que.Empty()){if (count < n){QElemType tmp = que.Head();que.Pop();que.Push(tmp);count++;}else if (count == n){cout << que.Head() << " ";que.Pop();count = 1;}}
}

  测试:

在这里插入图片描述
            

6.全部源码

Stack.h

#pragma once#define SElemType int
#define InitStackSize 100template<class T>
class Stack
{
public://构造函数Stack(){_base = _top = new SElemType[InitStackSize];_size = InitStackSize;}//析构函数~Stack(){delete[] _base;_top = _base = nullptr;_size = 0;}//入栈void Push(const SElemType& val){//栈满,扩容if (_top - _base == _size){//转移栈中的元素SElemType* newbase = new SElemType[_size * 2];for (int i = 0; i < _size; i++){newbase[i] = _base[i];}//删除原来栈中元素delete[] _base;_base = newbase;_top = newbase + _size;_size *= 2;}//入栈操作*_top = val;_top++;_size++;}//出栈void Pop(SElemType& e){if (_size == 0){cout << "该栈为空,无法删除\n";return;}//出栈操作e = *_top;_top--;_size--;}//重载出栈void Pop(){if (_size == 0){cout << "该栈为空,无法删除\n";return;}//出栈操作_top--;}//输出栈顶元素SElemType Top(){if (_base == _top){cout << "栈空,没有元素\n";return -1;}return *(_top - 1);}//判断栈空bool Empty(){if (_base == _top){return true;}else{return false;}}//打印栈中的元素void Print(){SElemType* cur = _base;if (_base == _top){cout << "该栈为空\n";return;}else{cout << "该栈中的元素为:";while (cur != _top){cout << *cur << " ";cur++;}cout << endl;}}private:SElemType* _base, * _top;int _size;
};

            

Queue.h

#pragma once#define QueueSize 100
#define QElemType inttemplate<class T>
class Queue
{
public://构造函数Queue(){_base = new QElemType[QueueSize];_front = _rear = 0;_capacity = QueueSize;}//析构函数~Queue(){delete[] _base;_base = nullptr;_front = _rear = 0;_capacity = 0;}//入队操作void Push(const QElemType& val){//判断队列是否已满if (_front == (_rear + 1) % _capacity){QElemType* newqueue = new QElemType[_capacity * 2];for (int i = _front; i < _rear; i++){newqueue[i] = _base[i];}//删除原来队列中元素delete[] _base;_base = newqueue;_capacity *= 2;}_base[_rear] = val;//如果想让队列超过QueueSize的长度,一定要%_capacity;_rear = (_rear + 1) % _capacity;}//出队操作void Pop(QElemType& e){if (_front == _rear){cout << "队列为空,无法删除\n";return;}e = _base[_front];_front = (_front + 1) % _capacity;}//重载出队操作void Pop(){if (_front == _rear){cout << "队列为空,无法删除\n";return;}_front = (_front + 1) % _capacity;}//输出队头元素QElemType Head(){if (_front == _rear){cout << "队列为空,无队头元素\n";return -1;}return _base[_front];}//判断是否为空队列bool Empty(){if (_front == _rear){return true;}else{return false;}}//打印队列中的元素void Print(){if (_front == _rear){cout << "该队列为空\n";return;}else{cout << "该队列中的元素为:";for (int i = _front; i < _rear; i++) {std::cout << _base[i] << " ";}cout << endl;}}private:QElemType* _base;int _front, _rear;int _capacity;
};

            

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
using namespace std;#include"Stack.h"
#include"Queue.h"void stack_test()
{Stack<int> st;st.Print();cout << "该栈是否为空:" << st.Empty() << endl;st.Push(1);st.Push(2);st.Push(3); st.Push(4);st.Print();cout << "栈顶元素为:" << st.Top() << endl;st.Pop();st.Pop();st.Print();cout << "该栈是否为空:" << st.Empty() << endl;st.Push(5);st.Push(6);st.Push(7);st.Push(8);st.Print();cout << "栈顶元素为:" << st.Top() << endl;st.Pop();st.Pop();st.Print();
}void queue_test()
{Queue<int> que;que.Print();cout << "该队列是否为空:" << que.Empty() << endl;que.Push(1);que.Push(2);que.Push(3);que.Push(4);que.Print();cout << "队头元素为:" << que.Head() << endl;que.Pop();que.Pop();que.Print();cout << "该队列是否为空:" << que.Empty() << endl;que.Push(5);que.Push(6);que.Push(7);que.Push(8);que.Print();cout << "队头元素为:" << que.Head() << endl;que.Pop();que.Pop();que.Print();
}void Decimal_Conversion()
{string s, table = "0123456789ABCDEF";int m, n;cout << "请输入:m为输入的数,n为转换的进制\n";cout << "m=";cin >> m;cout << "n=";cin >> n;bool flag = false;if (m == 0) cout << "0";//如果是负数,则转成正数,并标记一下if (m < 0){m = 0 - m;flag = true;}Stack<char> st;//按进制换算成对应的字符添加到swhile (m){st.Push(table[m % n]);m /= n;}if (flag){st.Push('-');}while (!st.Empty()){s += st.Top();st.Pop();}cout << s << endl;
}void Joseph_Exchange()
{cout << "约瑟夫环问题:请输入一共有m人,第n人出局:\n";int m, n;cout << "m=";cin >> m;cout << "n="; cin >> n;//填入队列中Queue<int> que;for (int i = 1; i <= m; i++){que.Push(i);}//计数器,计到目标就输入int count = 1;while (!que.Empty()){if (count < n){QElemType tmp = que.Head();que.Pop();que.Push(tmp);count++;}else if (count == n){cout << que.Head() << " ";que.Pop();count = 1;}}
}int main()
{//stack_test();//queue_test();//Decimal_Conversion();Joseph_Exchange();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp-vue3-微信小程序-标签选择器wo-tag

采用uniapp-vue3实现, 是一款支持高度自定义的标签选择器组件&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14960 使用示例 <template>&…

WPS、Excel表格增加一列,序列1到任意大小 / 填充某个范围的数字到列

Excel添加一列递增的数字方法有如下&#xff1a; 一、最常用的&#xff0c;使用鼠标放到右下角下拉增加 1、选中起始框的右下角&#xff0c;直到显示黑色实心十字 2、一直向下拖动 3、成功 这种填充方式是最常用的&#xff0c;100以内都可以轻松瞬间完成 1~100填充 但是如果…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通过…

Spring framework Day19:Spring AOP xml配置示例二

一、开始学习 1、新建项目&#xff0c;结构如下 2、添加 spring 依赖 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework&l…

将 vue2+ElementU 项目打包成安卓app

目标&#xff1a;将vue项目打包成安卓app 工具&#xff1a;HbuilderX 1.在HbuilderX中创建一个 5App 项目 创建好的app项目目录 2.将vue项目打包 2.1 在 vue.config.js 中添加公共路径&#xff08;解决打包后的app图片不显示问题&#xff09; module.exports defineConfig(…

软件测试(一)概念

软件测试 软件测试的生命周期&#xff1a; 需求分析→测试计划→ 测试设计、测试开发→ 测试执行→ 测试评估 需求分析&#xff1a;需求是非完整&#xff0c;需求是否正确测试计划&#xff1a;确定软件由谁测试&#xff0c;什么时候开始&#xff0c;什么时候结束&#xff0c;…

Java Kids-百倍提速【Mac IOS】

引言&#xff1a;当今社会&#xff0c;创新和提升效率已经成为了大家普遍的追求。无论是个人生活还是企业经营&#xff0c;我们都希望能够以更高的效率完成任务&#xff0c;节省时间和资源。因此&#xff0c;提速成为了一种时代的要求&#xff0c;而"Java Kids 百倍提速&q…

博客项目(前后端分离)(servlet实战演练)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;实战项目 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录 前言…

Vue 网络处理 - axios 异步请求的使用,请求响应拦截器

目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使用…

Umi3实战教程

一、框架介绍 umi是蚂蚁金服的前端开发框架&#xff0c;它内置了路由、web/移动端UI库、数据流、权限控制、常用hooks库、构建、部署、测试、等等一些工具&#xff0c;几乎涵盖了正常前端开发要用到的所有工具。 二、环境准备 pnpm 相比npm、yarn&#xff0c;pnpm更小更快扁平…

虚幻引擎:如何实现骨骼重定向

前言&#xff1a; 为什么需要做骨骼重定向&#xff0c;因为当前角色素材没有对应的动画&#xff0c;这时候我们可以找个身高体型差不多的带有动画素材的另一个角色来做重定向&#xff0c;这样我们就可以得到我们需要的动画素材了。 1.首先创建两个骨骼的IK绑定 2.然后给两个骨骼…

【算法|前缀和系列No.2】牛客网 DP35 【模板】二维前缀和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【牛客网刷题】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希…

发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外&#xff0c;在 Java 早期版本中&#xff0c; synchronized属于重量级锁&#xff0c;效率…

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的&#xff0c;什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件&#xff0c;实现缓存多个组件实例切换时&#xff0c;完成对卸载组件实例的缓存&#xff0c;从而使得组…

竞赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

DHorse v1.4.2 发布,基于 k8s 的发布平台

版本说明 优化特性 在集群列表增加集群版本&#xff1b;修改Jvm的GC指标名&#xff1b; 解决问题 解决shell脚本换行符的问题&#xff1b;解决部署历史列表页&#xff0c;环境名展示错误的问题&#xff1b;解决指标收集功能的异常&#xff1b; 升级指南 升级指南 DHorse…

零宽空格引发的问题

有人跟我反馈说有bug。 我说&#xff1a;啥bug&#xff1f; 对方说&#xff1a;刚申请的内部用户的账号登录不上去。 我说&#xff1a;还有这种事&#xff0c;报啥错&#xff1f; 登录的时候报了这个错&#xff1a; 我一看还好还好&#xff0c;跟上一次不一样的错&#xff…

“探寻服务器的无限潜能:从创意项目到在线社区,你会做什么?”

文章目录 每日一句正能量前言什么是服务器&#xff1f;服务器能做什么&#xff1f;服务器怎么用&#xff1f;部署创意项目&#xff0c;还是在线社区亦或做其他的&#xff1f;后记 每日一句正能量 未知的下一秒&#xff0c;千万不要轻言放弃。 前言 在数字化时代&#xff0c;服…

SpringBoot面试题7:SpringBoot支持什么前端模板?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot支持什么前端模板? Spring Boot支持多种前端模板,其中包括以下几种常用的: Thymeleaf:Thymeleaf是一种服务器端Java模板引擎,能够…

基于马尔可夫随机场的图像去噪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、马尔可夫随机场的基本原理 4.2、基于马尔可夫随机场的图像去噪算法 5.算法完整程序工程 1.算法运行效果图预览 原图&#xff1a; 加入噪声的图像&#xff1a; 滤波后的图像 迭代过程…