数据结构--【顺序表与链表】笔记

顺序表

template <class T>
class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类
//公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员,受保护成员在 arrList 类中仍然是受保护成员。
{
private:T* aList;  //存储顺序表的实例,以后可以直接拿aList[]当数组用int maxSize;int curLen;   //顺序表的当前长度int position;  //当前处理位置
public:arrList(const int size){maxSize = size;aList = new T[maxSize];curlen = position = 0;}~arrList(){delete[] aList;}void clear(){delete[] aList;curLen = position = 0;aList = new T[maxSize];}//查找操作bool arrList<T>::getPos(int& p, const T value){for (int i = 0; i <= curLen; i++){if (aList[i] == value){p = i;return true;}}return false;}//插入操作bool arrList <T> ::insert(const int p, const T value){if (curLen >= maxSize)  //检测当前数组是否越界{ cout << "overflow";  return false;}if (p<0 || p>curLen)   //检测插入位置是否合法{cout << "illegal";return false;}for (int i = curLen; i > p; i--){aList[i] = aList[i = 1];}aList[p] = value;curLen++;return true;}//删除操作bool arrList<T> ::delete(const int p){if (curLen <= 0)  //判断元素是否为空,空表不能删除{cout << "no element to delete \n"<<endl;return false;}if (p<0 || p>curLen-1)  //注意这里是p>curLen-1不是curLen{cout << "illegal";return false;}for (int i = p; i < curLen-1; i++){aList[i] = aList[i + 1];}curLen--;//这里不需要再对aList[curLen-1]进行清零,因为curLen长度已经减小了//最后一个元素不在操作范围内return false;}
};

链表 

单链表

head 是指向单链表开始结点的指针,tail 是指向单链表尾结点的指针,对链表的访问只能通过头尾指针进行操作

头结点:虚拟结点,值被忽略,不被看做表中的实际元素,避免对空表的处理

操作分别有:

  1. 结点的定义
  2. 单链表的类型定义
  3. 定义链表的构造函数和析构函数
  4. 链表的检索
  5. 链表的插入操作
  6. 链表的删除操作 

说明:Link是模板类,代表着结点

lnkList是单链表类,里面存储着管理链表的方法以及首尾指针 

template <class T> class Link  //代表链表中的一个结点
{
public:T data;  //保存结点的内容Link<T>* next;  //指向后继结点的指针(指向Link类的指针)//函数重载,一个是有一个参数的,另一个是有两个参数的Link(const T info, const Link<T>* nextValue = NULL)//既有下一个结点的地址,又有data//这里是默认值为NULL,即当只传入data时,默认为最后一个结点{data = info;next = nextValue;}Link(const Link<T>* nextValue)//只指向下一个结点的指针,但是并没有值{next = nextValue;}
};
//单链表的类型定义
//在定义模板类时,必须在类名之前加上模板参数声明template <class T>
template <class T> class lnkList:public List<T>
{
private:Link<T>* head, * tail;Link<T>* setPos(const int p);   //返回线性表指向第p个元素的指针值
public:lnkList(int s);~lnkList();bool isEmpty();...bool getPos(int& p, const T value);
};
//带有头结点的单链表的构造函数和析构函数
template<class T> lnkList<T>::lnkList(int defSize)
//在类外定义函数的时候要把模板类写完整了,加上<T>
{head = tail = new Link<T>;
}
template <class T> lnkList<T>::~lnkList()
{Link<T>* tmp;while (head != NULL){tmp = head;head = head->next;delete tmp;
//要先将head值给tmp(注意这里是指针的关系),然后再让head等于下一个指针
//删除了tmp也就相当于删除了第一个head
//如果直接delete head就会丧失对下一个结点的访问权}
}
//链表的检索
template <class T> Link<T>* lnkList<T>::setPos(int i)
{int count = 0;if (i == -1) return head;Link<T>* p = head->next;  //创建一个新结点,p指针是一个指向Link类型变量的指针,//在这个Link类型变量中是while (p != NULL && count < i){p = p->next;count++;}return p;
}
//链表的插入
template <class T> bool lnkList<T> ::insert(const int i, const T value)
{Link<T>* p,*q;//调用 setPos 函数找到插入位置的前一个节点if ((p = setPos(i - 1)) == NULL){cout << "非法插入点";return false;}q = new Link<T>(value, p->next); //q是新构建的结点p->next = q; //将新的q结点插入至p结点之后,也就是说p是q的上一个结点if (p == tail)tail = q;return true;
}
//链表的删除
template <class T> bool lnkList<T>::delete(const int i)
{Link<T>* p, * q;if ((p = setPos(i - 1)) == NULL || p == tail){cout << "非法删除点";return false;}q = p->next;//q是真正的待删结点if (q == tail){tail = p;p->next = NULL;delete q;}else if (q != NULL){p->next = q->next;delete q;}return true;
}

链表实验题

顺序表做法

偶遇顺序表难题,用指针+结构体做拼尽全力无法战胜,用数组做十分钟轻松战胜(但是sstream学了一阵子)

#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
int a[10000], b[10000];
int main()
{string line1, line2;getline(cin, line1);getline(cin, line2);stringstream ss1(line1);stringstream ss2(line2);int m, n;//m是系数,n是指数while (ss1 >> m >> n){a[n] = m;}while (ss2 >> m >> n){b[n] = m;}int len = max(sizeof(a) / 4, sizeof(b) / 4);for (int i = 0; i < len; i++){a[i] += b[i];}for (int i = len - 1; i >= 0; i--){if (a[i] == 0)   continue;cout << a[i] << " " << i << " ";}return 0;
}

链表做法

#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
class node
{int data;node* next;node(const int info,node* nextnode){data = info;next = nextnode;}node(node* nextnode){next = nextnode;}
};
class list {};
int main()
{}
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
struct node  //创建新结点
{int m;//系数int n;//指数node* next;node(int a, int b){m = a;n = b;next = nullptr;}
};
node* creat()//创建多项式列表
{node* head = nullptr;  //表示指向第一个结点的指针node* tail = nullptr;  //表示当前最新结点的指针,等全部录入完毕就是指向最后一个结点string ss1;getline(cin, ss1);stringstream sss(ss1);int a, b;while (sss >> a >> b){
//每次新建一个结点,给它一个新的指针node* newnode = new node(a, b);  //返回内存地址if (!head) head = tail = newnode;else{
//假设原来链表为A-->B-->C,此时tail指向C,当执行ail->next = newnode时候将C和新结点D连接在一起,
// 链表变成A-->B-->C-->D,然后再把tail更新成最新的D			tail->next = newnode; tail = newnode;}}return head;  //返回头指针就是返回整条链表
}
node* add(node* f1, node* f2) {node index(0, 0);node* tail = &index;while (f1 && f2) {if (f1->n > f2->n) {
//经典操作,同创建链表里头的tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->n < f2->n) {tail->next = f2;tail = tail->next;f2 = f2->next;}else {
//如果相等的话就复杂了int sum = f1->m + f2->m;node* tmp1 = f1;node* tmp2 = f2;
//先都往后移动一个结点f1 = f1->next;f2 = f2->next;if (sum != 0) {tmp1->m = sum;
//经典操作,连接新结点tmp1并更新tailtail->next = tmp1;tail = tail->next;tail->next = nullptr; // 防止遗留指针,相当于切断了和原来链的联系
//假设 f1 链表为 A(系数 3, 指数 2) -> B(系数 1, 指数 1),f2 链表为 C(系数 2, 指数 2) -> D(系数 4, 指数 1)。
// 当处理到指数为 2 的节点 A 和 C 时,系数相加结果为 3 + 2 = 5,将 A 的系数更新为 5 并连接到新链表尾部。
// 如果不将 tail->next 置为 nullptr,A 原本的 next 指针仍然指向 B,这会导致新链表中在 A 后面错误地连接了 B,
// 而后续可能会继续错误地处理这些遗留节点。}else {delete tmp1;}
//tmp2总是要删的delete tmp2;}}
//其实后面 f1?f1:f2 才是一个整体,如果f1存在,那么就接上f1的值tail->next = f1 ? f1 : f2;
//返回首结点的地址return index.next;
};void print(node* f1)
{node* cur = f1;bool first = true;while (cur){if (!first){cout << " ";}cout << cur->m << " " << cur->n;first = false;cur = cur->next;}
}
void free(node* f)
{while (f){node* tmp = f;f = f->next;delete tmp;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* summ = add(f1, f2);print(summ);free(summ); free(f1);free(f2);return 0;
}

链表实验选做题

 照葫芦画瓢总算出来一个,但是需要逆序输出,但是爷爷懒得写直接存个数组里头逆序输出了hhh

#include<iostream>
#include<sstream>
using namespace std;struct node
{int data;node* next;node(int a){data = a;next = nullptr;}
};
node* creat()
{node* head=nullptr;node* tail=nullptr;string s;getline(cin, s);stringstream ss(s);int a;while (ss >> a){node* newnode = new node(a);if (!head) head = tail = newnode;else {tail->next = newnode;tail = newnode;}}return head;
}
node* order(node* f1, node* f2)
{node index(0);node* tail = &index;while (f1 && f2){if (f1->data < f2->data){tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->data > f2->data){tail->next = f2;tail = tail->next;f2 = f2->next;}else{f1 = f1->next;f2 = f2->next;tail->next = f1;tail = tail->next;tail->next = f2;tail = tail->next;}}tail->next= f1 ? f1 : f2;return index.next;
}
void print(node* head)
{int count = 0;int a[100000] = { 0 };node* tail = head;while (tail){count++;a[count] = tail->data;tail = tail->next;}for (int i = count; i >= 1; i--) cout << a[i] << " ";
}
void free(node* f)
{while (f){node* cur = f;f = f->next;delete cur;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* result = order(f1, f2);print(result);free(result);return 0;
}

洛谷 单向链表

题目描述

实现一个数据结构,维护一张表(最初只有一个元素 1)。需要支持下面的操作,其中 x 和 y 都是 1 到 106 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 105:

  • 1 x y :将元素 y 插入到 x 后面;
  • 2 x :询问 x 后面的元素是什么。如果 x 是最后一个元素,则输出 0;
  • 3 x:从表中删除元素 x 后面的那个元素,不改变其他元素的先后顺序。

输入格式

第一行一个整数 q 表示操作次数。

接下来 q 行,每行表示一次操作,操作具体见题目描述。

输出格式

对于每个操作 2,输出一个数字,用换行隔开。

输入输出样例

输入 

6
1 1 99
1 99 50
1 99 75
2 99
3 75
2 1

输出

75
99

一开始写的完美无瑕的代码结果T了两个点

#include<iostream>
#include<sstream>
using namespace std;
struct node
{int data;node* next;node(int n){data = n;next = nullptr;}
};
node* setpos(node* head,int x)  
{node* cur = head;while (cur->data != x){cur = cur->next;}return cur;
}
node* insert(node* head,int x,int y)
{node* cur = setpos(head, x);node* cur2 = cur->next;node* newnode=new node(y);newnode->next = cur2;cur->next = newnode;return head;
}
node* remove(node* head,int x)
{node* cur = setpos(head, x);node* cur1 = cur->next;	cur->next=cur1->next;delete cur1;return head;
}
void print(node* curnode)
{cout <<curnode->data<<endl;
}
void free(node* head)
{while (head){node* tmp = head;head = head->next;delete tmp;}
}
int main()
{int n,k,x,y;cin >> n;node* index = new node(1);node* cur = nullptr;for (int i = 0; i < n; i++){cin >> k;if (k == 1){cin >> x >> y;index = insert(index, x, y);}else if (k == 2){cin >> x;cur= setpos(index, x);cur = cur->next;if (!cur) {cout << 0<< endl; continue;}print(cur);}else if (k == 3){cin >> x;index = remove(index, x);}}free(index);return 0;
}

 那应该是还得优化,但是怎么优化呢,网上优化代码看不懂思密达,但是我会写数组呀嘻嘻

#include<iostream>
#include<sstream>
using namespace std;
int a[1000000];  //a[i]中i表示data,a[i]表示下一个结点的地址(就是第几位)
void insert()
{int x, y;cin >> x >> y;a[y] = a[x];a[x] = y;
}
void remove()
{int x;cin >> x;a[x] = a[a[x]];
}
int main()
{a[1] = 0;int k,n;cin >> n;for (int i = 0; i < n; i++){cin >> k;if (k == 1) insert();if (k == 2){int x;cin >> x;if (!a[x]){cout << 0 << endl;continue;}else cout << a[x]<<endl;}if (k == 3) remove();}return 0;
}

洛谷 临值查找

题目描述

给定一个长度为 n 的序列 A,A 中的数各不相同。

对于 A 中的每一个数 Ai​,求:

min1≤j<i​∣Ai​−Aj​∣

以及令上式取到最小值的 j(记为 Pi​)。若最小值点不唯一,则选择使 Aj​ 较小的那个。

输入格式

第一行输入整数 n,代表序列长度。

第二行输入 n 个整数 A1​∼An​,代表序列的具体数值,数值之间用空格隔开。

输出格式

输出共 n−1 行,每行输出两个整数,数值之间用空格隔开。

分别表示当 i 取 2∼n 时,对应的 min1≤j<i​∣Ai​−Aj​∣ 和 Pi​ 的值。

输入输出样例

输入

3
1 5 3

输出 

4 1
2 1

 全WA(笑)后来发现题目理解错了,人家让找最小的data,不是最小的id

修改后还是错

#include<iostream>
#include<sstream>
#include<cmath>
#include<climits> //使用INT_MAX
using namespace std;
struct node
{int data;int id;node* next = NULL;node(int n,int z){data = n;id = z;}
};
void result(node* head, node* cur)
{int min_ans = INT_MAX;int index = -1;int select_val = INT_MAX;while (head != cur){int cur_data = abs(cur->data - head->data);if (cur_data< min_ans||cur_data==min_ans&&head->data<select_val){min_ans = cur_data;select_val = head->data;index = head->id;}head = head->next;}cout << min_ans << " " << index << endl;
}int main()
{int n,k;cin >> n;node* head = NULL;node* tail = NULL;bool flag = true;for (int i = 1; i <= n; i++){cin >> k;node* newnode = new node(k,i);if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;if(i!=1) result(head, tail);}return 0;
}

这里出现问题的在于

if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;

这里在首结点吧tail的next赋值newnode,造成循环链表,正确写法应该是:

if (!head) { head = tail = newnode; flag = false; }else {tail->next = newnode;tail = newnode;}

全部改完以后没问题了,但是还是T了四个点

用set优化,快速排序,这样就不用一个一个找了

#include<iostream>
#include<sstream>
#include<cmath>
#include<set>
#include <climits> // 添加头文件以使用INT_MAX
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n, val;cin >> n;set<pair<int,int>> nums;for (int i = 1; i <= n; i++){cin >> val;int min_diff = INT_MAX;//记录最小差值int min_val = INT_MAX;//记录最小的Ajint ans_id = -1;if (i == 1){nums.insert({ val,i });continue;}auto it = nums.lower_bound({val,0});//nums.end() 返回的末尾迭代器不指向任何有效元素if (it != nums.end()){if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}if (it != nums.begin()) {it--;if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}cout << min_diff << " " << ans_id<<'\n';nums.insert({ val,i });}return 0;
}

 学到了用set的很多知识,比如:

1.set中每一个元素的键值都唯一,所以在向set中插入相同的数据的时候,会插不进去

2.所有元素都会根据元素的字典序进行排序,先比较第一个,第一个一样大就比较第二个,默认从小到大

3.迭代器声明时用auto it=nums容器中某个元素,表示这个元素的时候就用 it->first 和 it->second 来表示

4.nums.end()返回的末尾迭代器不指向任何有效元素

5.用于解除cin和cout的绑定,加快速度防止TLE

ios::sync_with_stdio(false);
cin.tie(0);

6.set声明:set<pair<int,int>> 

用STL写链表(蓝桥杯书上的)

#include<iostream>
#include<list>
using namespace std;
list<int> list1;//创建一个STLlist实例
int main()
{int n, m, x, y, z;cin >> n >> m;for (int i = 1; i <= n; i++)list1.push_back(i); //在链表尾部添加元素while (m --){cin >> x >> y >> z;list1.remove(x);list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定义if (z == 0) list1.insert(++it, x);if (z == 1) list1.insert(it, x);}for (int x : list1){cout << x << " ";}cout << endl;return 0;
}

知识点:

  • list1.push_back(x):将x添加至链表的尾部
  • pop_back():删除链表尾部元素
  • pop_front():删除链表头部元素
  • front():读取头部元素
  • back():读取尾部元素
  • insert(it,x):在it位置插入元素x
  • erase(it):在it位置删除元素,也可以用list1.remove(x)删除x元素
  • 定义迭代器:
    list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定义

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

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

相关文章

Docker容器与宿主机目录映射深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Docker容器与宿主机目录映射基础原理 在深入了解如何查询 Docker 容器目录在宿主机的映射目录之前&#xff0c;有必要先明晰其背后的基础原理。Docker 容器通过挂载&#xff08;mount&#xff09;机制将宿主机的…

p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳

向 豆包 提问&#xff1a;编写一个 p5.js 脚本&#xff0c;模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转&#xff0c;并显示透明的轮廓线。请确保实现适当的碰撞检测&#xff0c;使小球保持在球体内部。 cd p5-demo copy…

javascript-es6 (六)

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤&#xff0c;按照步骤解决问题 面向对象 面向对象是把事务分解成为一个个对象&…

Linux第0节:Linux环境的搭建

一、Linux 环境的搭建方式 搭建方式主要有三种&#xff1a; 直接安装在物理机上。但是由于 Linux 桌面使用起来非常不友好&#xff08;不推荐&#xff09;。使用虚拟机软件, 将 Linux 搭建在虚拟机上。但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上…

计算机网络:计算机网络的概念

1.计算机网络&#xff1a;由若干个结点和链接这些的链路组成。 2.集线器&#xff08;Hub&#xff09;&#xff1a;可以把多个结点连接起来&#xff0c;组成一个计算机网络。 不能避免数据冲突的情况 3.交换机&#xff08;Switch&#xff09;:可以把多个结点连接起来&#x…

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

Vue 实现智能检测文字是否溢出,溢出显示省略号,鼠标悬浮显示全部【附封装组件完整代码+详细注释+粘贴即食】

一、场景需求 在项目中&#xff0c;经常会遇到文本内容超出容器的情况。为了提高用户体验&#xff0c;我希望在文字溢出时显示悬浮提示&#xff0c;未溢出时则不显示。 二、效果演示 三、实现原理 DOM宽度对比法&#xff1a;通过比较元素的scrollWidth&#xff08;实际内容宽…

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏

大家好&#xff01;今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括&#xff1a;控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂&#xff0c;适合初学者学习和实践。 游戏功能概述 玩家控制&#xff1a;使用键…

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…

关于mybatis查询时,时间字段的映射问题

目录 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 1.2 datetime 2.mybatis从mysql数据库查询出上述两种类型的字段后&#xff0c;映射到Java实体类时的问题 3.结语 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 格式&#xff1a;2002-09-23 特点&#xff1a…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…

【鸿蒙开发】MongoDB入门

https://www.mongodb.com/try/download/community 下载MongoDB: var mongoose require("mongoose");// localhost 域名&#xff0c;代表本机 // 127.0.0.1 ip , 代码本机 mongoose.connect("mongodb://localhost:27017/jiaju").then(() > {console.l…

Linux中的TCP编程接口基本使用

TCP编程接口基本使用 本篇介绍 在UDP编程接口基本使用已经介绍过UDP编程相关的接口&#xff0c;本篇开始介绍TCP编程相关的接口。有了UDP编程的基础&#xff0c;理解TCP相关的接口会更加容易&#xff0c;下面将按照两个方向使用TCP编程接口&#xff1a; 基本使用TCP编程接口…

wireshark 如何关闭混杂模式 wireshark操作

Fiddler和Wireshark都是进行抓包的工具&#xff1a;所谓抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&#xff0c;也用来检查网络安全。抓包也经常被用来进行数据截取等。黑客常常会用抓包软件获取你非加密的上网数据&#xff0c;然后通过分析&#…

IDEA2024又一坑:连接Docker服务连不上,提示:Cannot run program “docker“: CreateProcess error=2

为新电脑安装了IDEA2024版&#xff0c;因为局域网中安装有Docker,所以这台电脑上没有安装&#xff0c;当运行时发现死活连不上Docker报&#xff1a;Cannot run program “docker“: CreateProcess error2 分析&#xff1a; Docker服务有问题 其它电脑都能连&#xff0c;排除 网…

文件包含漏洞第一关

一、什么是文件包含漏洞 1.文件包含漏洞概述 和SQL注入等攻击方式一样&#xff0c;文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。 什么叫包含呢&#xff1f;以PHP为例&#xff0c;我们常常把可重复使…

网络安全事件响应--应急响应(windows)

应用系统日志 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息&#xff0c;对于系统管理员更为有用。安全日志记录着事件审计信息&#xff0c;包括用户验证&#xff08;登录、远程访问等&#x…

C++蓝桥杯基础篇(九)

片头 嗨&#xff01;小伙伴们&#xff0c;大家好~ 今天我们将学习蓝桥杯基础篇&#xff08;十&#xff09;&#xff0c;学习函数相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、函数基础 一个典型的函数定义包括以下部分&#xff1a;返回类型、函数名…

JVM内存结构笔记01-运行时数据区域

文章目录 前言运行时数据区域1.程序计数器定义特点总结 2.虚拟机栈2.1 定义局部变量表 ★操作数栈动态链接方法返回地址(方法出口) 2.2 栈内存溢出演示栈内存溢出 java.lang.StackOverflowError 2.3问题辨析1. 垃圾回收是否涉及栈内存&#xff1f;2. 栈内存分配越大越好吗&…

01-简单几步!在Windows上用llama.cpp运行DeepSeek-R1模型

1.llama.cpp介绍 Llama.cpp 是一个开源的、轻量级的项目&#xff0c;旨在实现 Meta 推出的开源大语言模型 Llama 的推理&#xff08;inference&#xff09;。Llama 是 Meta 在 2023 年开源的一个 70B 参数的高质量大语言模型&#xff0c;而 llama.cpp 是一个用 C 实现的轻量化…