又臭又长的字符串处理(简易内存池)

#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;
}
posted @ 2022-11-13 00:06  chunbai11  阅读(43)  评论(0)    收藏  举报