#include<iostream>
#include<vector>
#include<string>
using namespace std;
int max = 100;
//分配函数
void alloc(vector<vector<int>> &address,int size) {
if (size > 100||size==0) {
cout << "error" << endl;
return;
}
//第一种情况,第一次申请内存,直接输出0坐标,将第一段的地址终点设置为size-1
if (address.size() == 0) {
address.push_back({ 1,0,size-1 });
cout << '0'<<endl;
return;
}
//第二种情况,向已释放的内存块中分配内存。也就是对地址数组内的内存块搜索,找到未使用的足够大小的内存块。
for (auto &i : address) {
if (i[0] != 1&& i[2] - i[1] + 1 >= size) {
i[0] = 1;
i[2] += size ;
cout << i[1] << endl;
return;
}
else continue;
}
//第三种情况,重新从地址块最后面开辟一块地址块,需要考虑内存池的最大值。
int end = address.back()[2]+1;
if (end > 99 || end + size - 1 > 99) {
cout << "error" << endl;
return;
}
cout << end << endl;
address.push_back({ 1,end ,end + size-1 });
}
//释放函数
void rel(vector<vector<int>> &address,int begin) {
//对空的内存池释放
if (address.size() == 0) {
cout << "error" << endl;
return;
}
//寻找首地址相同的内存块
for (auto &i : address) {
if (i[0] == 1) {
if (i[1] == begin) {
if (i[0] == -1 || i[0] == 0) {
cout << "error" << endl;
return;
}
else {
i[0] = -1;
}
}
}
else if (i[0] == -1) {
cout << "error" << endl;
}
else
continue;
}
}
int main() {
int n = 0;
cin >> n; //读取n
string temp;
getline(cin, temp);//换行
vector<pair<int,int>> op;//二元的操作组,first只有1和0的值,1代表申请内存,0代表释放内存,second代表操作的参数。
/*7
REQUEST=10
REQUEST=20
RELEASE=0
RELEASE=20
RELEASE=0
REQUEST=20
REQUEST=10
*/
while (n--) {
string str;
getline(cin, str);
int p = str.size()-1;
int num = 0;
int flag = 1;
while (str[p] >= '0' && str[p]<='9') {
num += str[p] - '0';
num *= 10;
--p;
}
//因为输入是格式化的,所以只要判断字符串中第3个元素就可以区分2种操作。
if (str[2] == 'L') {
flag = 0;
}
op.push_back({flag,num});
}
vector<vector<int>> address;
//地址组每个元素的每一列代表的含义:第一列是状态,有0(未使用),-1(已释放),1(在使用);第二列是每块内存的起始地址,第三列是每块内存的终点坐标。
//执行操作。
for (auto &i : op) {
if (i.first) {
alloc(address,i.second);
}
else {
rel(address,i.second);
}
}
return 0;
}
标签:cout,int,内存,str,address,字符串,又臭又长,size
From: https://www.cnblogs.com/chunbai11/p/16885204.html