操作系统 内存动态分区分配 循环首次适应算法 C++实现

循环首次适应算法

#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<stdlib.h>
string bai="○";
string hei="●";
class process
{
public:
    int name;
    int psize;//进程大小
    int a;//第几个位置
    process(int name,int psize,int a){
        this->name=name;
        this->psize=psize;
        this->a=a;
    }
};
class area
{
public:
    int asize;//分区大小
    int x;//物理位置
    area(int asize,int x){
        this->asize=asize;
        this->x=x;
    }
};
vector<string> mycin(int x)
{
    vector<string> v;
    for(int i=0;i<x;i++){
        v.push_back(bai);
    }
    return v;
}
void mycout(vector<string> v)
{
    cout<<"内存占用情况如下:"<<endl;
    for(int i=0;i<v.size();i++){
        if(i%20==0&&i!=0){
            cout<<endl;
        }
        cout<<v[i];
    }
}
process getroom(vector<string>& v,int& s,int k)
{
    int x;
    vector<string> vv=v;
    int ss=s;
    cout<<endl<<"请输入进程"<<k<<"所需的内存空间"<<endl;
    cin>>x;
    int m=1;
    for(int i=0;i<v.size();i++){
        m=1;
        for(int j=0;j<x;j++){
            int g=0;
            if(v[s]==bai){
                v[s]=hei;
                s++;i++;g++;
                if(s>=v.size()){//判断是否超出空间
                    s%=v.size();
                }
            }
            else{
                if(g==x-1)
                    m=1;
                else{
                    m=0;v=vv;
                }
                break;
            }
        }
        if(m==1){
            break;
        }
        while(v[s]!=bai&&i<v.size()){
            s++;i++;
            if(s>=v.size()){//判断是否超出空间
                s%=v.size();
            }
        }
    }
    if(m==1){//分配成功
        int g=s;
        if(g<=0){
            g+=v.size();
        }
        int o=g-x;
        if(o<0){
            o+=v.size();
        }
        process p(k,x,o);
        return p;
    }
    else{
        s=ss;v=vv;m=0;
        cout<<"内存不够,分配失败"<<endl;
        process p(-1,0,0);
        return p;
    }
}
vector<process> cinprocess(vector<string>& v,int& s,int &k,vector<process> p)//输入进程
{
    while(1){
        mycout(v);
        p.push_back(getroom(v,s,k));
        if(p[p.size()-1].name==-1)
            p.pop_back();
        k++;
        if(k%3==0){
            cout<<"是否继续输入进程:"<<endl;
            cout<<"1----是   2----否"<<endl;
            int m;cin>>m;
            system("cls");
            if(m==2) break;
        }
    }
    return p;
}
void coutprocess(vector<process> p)//查看进程情况
{
    cout<<endl<<"各进程情况如下:"<<endl;
    for(int i=0;i<p.size();i++){
        cout<<"进程"<<p[i].name<<"   占用大小:"<<p[i].psize<<"    起始位置是:"<<p[i].a<<endl;
    }
}
vector<area> getarea(vector<string> v)//得到分区
{
    vector<area> a;
    int x=0;
    for(int j=0;j<v.size();j++){
        if(v[j]==bai){
            x++;
            if(j==v.size()-1){
                area aa(x,j-x+1);
                a.push_back(aa);
                x=0;
            }
        }
        else{
            if(x!=0){
                area aa(x,j-x);
                a.push_back(aa);
                x=0;
            }
        }
    }
    return a;
}
void coutarea(vector<area> a)
{
    cout<<endl<<"空闲分区情况表如下:"<<endl;
    for(int i=0;i<a.size();i++){
        cout<<"空闲分区"<<i<<"    长度是"<<a[i].asize<<"    起始地址在 "<<a[i].x<<"位置"<<endl;
    }
    cout<<endl;
}
void deleteprocess(vector<string> &v,vector<process> &p)//删除进程
{
    while(1){
        int name,m=0;
        process pp(0,0,0);
        cout<<endl<<"请输入想要删除的进程名:"<<endl;
        cin>>name;
        //vector<process>::iterator t=p.begin();
        for(int i=0;i<p.size();i++){
            if(p[i].name==name){
                pp.a=p[i].a;pp.name=p[i].name;pp.psize=p[i].psize;
                p.erase(p.begin()+i);
                m=1;
                break;
            }
        }
        for(int i=0;i<pp.psize;i++){
            v[pp.a+i]=bai;
        }
        if(m==0){
            cout<<"未找到该进程,删除失败"<<endl;
        }
        system("cls");
        coutprocess(p);//输出进程
        mycout(v);
        cout<<endl<<"进程"<<name<<"删除成功,是否继续删除进程:"<<endl;
        cout<<"1----是   2----否"<<endl;
        int x;cin>>x;
        if(x==2) break;
    }

}
int main()
{
    int k=0,s=0;//进程总数  物理磁盘指针
    vector<string> v=mycin(100);//创建物理磁盘
    vector<process> p;//创建进程
    vector<area> a;//创建分区
    //进入菜单
    int num=0;
    do{
        cout<<"1------------调用进程,申请内存------------"<<endl;
        cout<<"2------------结束进程,释放内存------------"<<endl;
        cout<<"3-------查看进程,磁盘,空闲分区情况-------"<<endl;
        cout<<"4-----------------退出系统-----------------"<<endl;
        cout<<"请选择:"<<endl;
        cin>>num;
        switch(num)
        {
            case 1:
                system("cls");
                p=cinprocess(v,s,k,p);//得到进程
                break;
            case 2:
                system("cls");
                coutprocess(p);//输出进程
                mycout(v);
                deleteprocess(v,p);
                break;
            case 3:
                system("cls");
                a=getarea(v);//得到分区
                mycout(v);
                coutprocess(p);//输出进程
                coutarea(a);//输出分区
                break;
            case 4:
                cout<<"系统成功退出"<<endl;
                break;
            default:
                cout<<"选择错误,请重新选择!"<<endl;
        }
    }while(num!=4);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述cess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmd6aGlqaXU=,size_16,color_FFFFFF,t_70)

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值