算符优先分析法 C++ 编译原理
算符优先分析法 C++ 编译原理
运行环境:Visual Studio 2005
#include "SStack.h"
#include <iostream>
#include <string>
using namespace std;
class Functor
{
private :
char ** table;
string ** production;
string prog;//待分析字符串
int p;//字符指针
int num;//终结符个数
int num1;//产生式个数
SStack <char> stack;
public:
Functor(int m,int n,char ** T,string **prod,string pr)
{
num=m;
num1=n;
table=T;
production=prod;
prog=pr;
p=0;
stack.push('$');
}
void traversal()
{
while(p<(prog.length()))
{
stack.display();
cout<<prog.substr(p)<<" ";
char ch;
if(Getnum(stack.gettop()))
{
ch=stack.gettop();
}
else
{
ch=stack.getsecond();
}
switch(compare(ch,prog[p]))
{
case 1:
case 2:stack.push(prog[p]);p++;cout<<"移入"<<endl;break;
case 3:reduct();cout<<"归约"<<endl;break;
}
}
cout<<"分析成功!"<<endl;
}
int Getnum(char ch)
{
for(int i=1;i<num;i++)
{
if(ch==table[i][0])
{
return i;
}
}
return 0;
}
int compare(char col,char row)
{
int c=Getnum(col);
int r=Getnum(row);
switch( table[c][r])
{
case '>': return 3;break;
case '<': return 2;break;
case '=': return 1;break;
default:cout<<endl<<"输入串有误,程序将终止!"<<endl;system("pause");exit(0);break;
}
}
void reduct()
{
//待定
string token="";
int temp;
string str="";
if(!Getnum(stack.gettop()))
{
token+=stack.gettop();
stack.pop();
}
char ch=stack.gettop();
str+=ch;
temp=Haven(str);
if(temp!=-1)
{
token+=production[temp][0];
}
else
{
token+=ch;
}
stack.pop();
bool Nover=true;
while(Nover)
{
if(Getnum(stack.gettop()))
{
if(compare(stack.gettop(),ch)==2)
{
Nover=false;
}
else
{
ch=stack.gettop();
str="";
str+=ch;
temp=Haven(str);
if(temp!=-1)
{
token+=production[temp][0];
}
else
{
token+=ch;
}
stack.pop();
}
}
else
{
token+=stack.gettop();
stack.pop();
}
}
string token2="";
//cout<<token<<" ";
for(int i=token.length()-1;i>=0;i--)
{
token2+=token[i];
}
//cout<<token2<<endl;
if(Haven(token2)!= -1)
{
stack.push(production[Haven(token2)][0][0]);
}
else
{
cout<<"输入串有误!分析终止!"<<endl;
system("pause");
exit(0);
}
}
int Haven(string temp)
{
for(int i=0;i<num1;i++)
{
int j=1;
while(production[i][j]!="")
{
if(temp==production[i][j])
{
return i;
}
j++;
}
}
return -1;
}
public:
~Functor(void)
{
}
};
稀疏矩阵的转置实现 C++ 数据结构
稀疏矩阵的转置实现 C++ 数据结构
运行环境:Visual Studio 2005
#include "Triple.h"
#include <iostream>
using namespace std;
template <typename T>
class TSMatrix
{
private:
T **Parray;
T **Qarray;
Triple<T> *data;
Triple<T> *Cdata;
int mu,nu,tu;
public:
TSMatrix(void)
{
//Parray=NULL;
data=new Triple [100];
Cdata=new Triple [100];
mu=0;
nu=0;
tu=0;
}
TSMatrix(T**p,T**q,int m,int n)
{
Parray=p;
Qarray=q;
mu=m;
nu=n;
tu=0;
for(int p=0;p<mu;p++)
{
for(int q=0;q<nu;q++)
{
if(Parray[p][q]!=0)
{
tu++;
}
}
}
data=new Triple<T>[tu+1];
Cdata=new Triple<T>[tu+1];
}
void CreateTS()
{
int opp=0;
for(int p=0;p<mu;p++)
{
for(int q=0;q<nu;q++)
{
if(Parray[p][q]!=0)
{
Triple<T> temp(p,q,Parray[p][q]);
data[opp]=temp;
opp++;
}
}
}
}
void Change()
{
int *num=new int [nu+1];
int *cpot=new int [nu+1];
for(int col=0;col<nu;col++)
{
num[col]=0;
}
for(int i=0;i<tu;i++)
{
num[data[i].j]++;
}
cpot[0]=0;
for(int i=1;i<nu;i++)
{
cpot[i]=cpot[i-1]+num[i-1];
}
for(int i=0;i<tu;i++)
{
int p=cpot[data[i].j];
Cdata[p].i=data[i].j;
Cdata[p].j=data[i].i;
Cdata[p].e=data[i].e;
cpot[data[i].j]++;
}
for(int i=0;i<tu;i++)
{
Qarray[Cdata[i].i][Cdata[i].j]=Cdata[i].e;
if(!(i%5)){cout<<endl;}
cout<< "<" << Cdata[i].i << " "<< Cdata[i].j<< ">"<<Cdata[i].e<<" ";
}
delete []num;
delete []cpot;
}
void Display()
{
for(int i=0;i<tu;i++)
{
if(!(i%5)){cout<<endl;}
cout<< "<" << data[i].i << " "<< data[i].j<< ">"<<data[i].e<<" ";
}
cout<<endl;
}
public:
~TSMatrix(void)
{
delete []data;
delete []Cdata;
}
};
弗洛伊德算法 C++ 数据结构
弗洛伊德算法 C++
运行环境:Visual Studio 2005
#include <iostream>
using namespace std;
class FLOYD
{
private:
int Num;
double **D;
bool ***P;
int INFINITY;
public:
FLOYD(double **aa,int num)
{
D=aa;
Num=num;
INFINITY=8888;
P=new bool **[Num];
for(int v=0;v<Num;v++)
{
P[v]=new bool *[Num];
for(int w=0;w<Num;w++)
{
P[v][w]=new bool [Num];
for(int u=0;u<Num;u++)
{
P[v][w][u]=false;
}
}
}
}
void ShortestPath()
{
for(int v=0;v<Num;v++)
{
for(int w=0;w<Num;w++)
{
if(D[v][w]<INFINITY)
{
P[v][w][v]=true;
P[v][w][w]=true;
}
}
}
for(int u=0;u<Num;u++)
{
for(int v=0;v<Num;v++)
{
for(int w=0;w<Num;w++)
{
if(D[v][u]+D[u][w]<D[v][w])
{
D[v][w]=D[v][u]+D[u][w];
for(int i=0;i<Num;i++)
{
P[v][w][i]=P[v][u][i]||P[u][w][i];
//cout<<P[v][w][i]<<" ";
}
//cout<<endl;
}
}
}
}
}
void lookfor(int m,int n)
{
for(int i=0;i<Num;i++)
{
if(P[m][n][i]&&m!=i&&n!=i)
{
lookfor(m,i);
cout<<i+1<<"->";
lookfor(i,n);
}
}
}
double Getshort(int m,int n)
{
return D[m][n];
}
~FLOYD(void)
{
}
};
语义分析 C++ 编译原理
语义分析 C++ 编译原理
运行环境:Visual Studio 2005
语法分析的递归算法 C++ 编译原理
语法分析的递归算法 C++ 编译原理
运行环境:Visual Studio 2005
算符优先分析法 C++ 编译原理
算符优先分析法 C++ 编译原理
使用环境:Visual Studio 2005
词法分析 C++实现 编译原理
词法分析 C++实现 编译原理
使用环境:Visual Studio 2005
作业调度 操作系统 C++
作业调度算法 C++ 操作系统
运行环境:Visual Studio 2005
银行家算法的C++实现
#pragma once
#include "Processor.h"
#include <iostream>
using namespace std;
class Control
{
private :
Processor * progress;
int num;
int *Available;
public:
Control(int n,int *A,int m)
{
num=n;
Available=A;
progress=new Processor [num];
string na="";
cout<<"请依次输入各个进程的名字及其资源的最大需求量:"<<endl;
for(int i=0;i<num;i++)
{
cin>>na;
int *temp=new int [num];
for(int j=0;j<m;j++)
{
cin>>temp[j];
}
progress[i].Change(m,temp,na);
}
}
void Distribute()
{
int n=0;
while(!Allover())
{
int i=n%num;
n++;
if(!progress[i].Finish)
{
cout<<"当前进程名:"<<progress[i].name<<endl;
progress[i].Request();
cout<<"资源请求:";
for(int j=0;j<progress[i].num;j++)
{
cout<<progress[i].Req[j]<<" ";
}
cout<<"资源需要:";
for(int j=0;j<progress[i].num;j++)
{
cout<<progress[i].Need[j]<<" ";
}
cout<<endl;
if(Finderror(i))
{
for(int j=0;j<progress[i].num;j++)
{
Available[j]=Available[j]-progress[i].Req[j];
progress[i].Allocation[j]=progress[i].Allocation[j]+progress[i].Req[j];
progress[i].Need[j]=progress[i].Need[j]-progress[i].Req[j];
}
if(Isover(i))
{
progress[i].Finish=true;
for(int k=0;k<progress[i].num;k++)
{
Available[k]=Available[k]+progress[i].Max[k];
}
cout<<progress[i].name<<"进程运行结束!"<<endl;
}
if(!Detecting())
{
for(int j=0;j<progress[i].num;j++)
{
Available[j]=Available[j]+progress[i].Req[j];
progress[i].Allocation[j]=progress[i].Allocation[j]-progress[i].Req[j];
progress[i].Need[j]=progress[i].Need[j]+progress[i].Req[j];
}
cout<<"会出现死锁,请求被驳回。进程被暂停!执行下一进程……"<<endl;
}
}
else
{
cout<<"请求资源出错!进程被暂停!执行下一进程……"<<endl;
}
}
}
cout<<"进程全部运行结束!"<<endl;
}
bool Finderror(int n)//判断请求是否错误
{
for(int i=0;i<progress[n].num;i++)
{
if(progress[n].Need[i]<progress[n].Req[i])
{
return false;
}
}
return true;
}
bool Detecting()//死锁检测
{
string name="";
int *Work=new int [progress[0].num];
bool *Finish=new bool [num];
for(int i=0;i<progress[0].num;i++)
{
Work[i]=Available[i];
}
for(int i=0;i<num;i++)
{
Finish[i]=progress[i].Finish;
}
int m=num;
int n=0;
while(m)
{
int temp=n%num;
if(!Finish[temp])
{
if(compare(temp,Work))
{
Finish[temp]=true;
name=name+progress[temp].name+" ";
for(int i=0;i<progress[0].num;i++)
{
Work[i]=Work[i]+progress[temp].Allocation[i];
}
m=num;
}
}
n++;
m--;
}
for(int i=0;i<num;i++)
{
if(!Finish[i])
{
return false;
}
}
cout<<"安全序列:"<<name<<endl;
return true;
}
bool compare(int n,int *Work)//
{
for(int i=0;i<progress[n].num;i++)
{
if(progress[n].Need[i]>Work[i])
{
return false;
}
}
return true;
}
bool Isover(int n)//判断进程是否可以执行结束
{
for(int i=0;i<progress[n].num;i++)
{
if(progress[n].Allocation[i]!=progress[n].Max[i])
{
return false;
}
}
return true;
}
bool Allover()//判断所有进程是否已执行结束
{
for(int i=0;i<num;i++)
{
if(!progress[i].Finish)
{
return false;
}
}
return true;
}
void Display(int n,int * temp)
{
for(int i=0;i<n;i++)
{
cout<<temp[i]<<" ";
}
}
public:
~Control(void)
{
}
};
环境:Visual Studio 2005
页面置换算法(C++)
时钟算法
页面置换算法
#pragma once
#include <iostream>
#include "Pclass.h"
using namespace std;
class Allocation
{
private:
int pnum;//页面数
int bnum;//分配块数
//int ID;
int num;//访问页面次数
Pclass * block;//块数组
int *page;//页访问顺序
//int p;
public:
Allocation(int pn,int bl,int n)
{
pnum=pn;
bnum=bl;
num=n;
//ID=id;
block=new Pclass [bnum];
page=new int [num];
cout<<"页面访问顺序:";
for(int i=0;i<num;i++)
{
page[i]=rand()%pnum+1;
cout<<page[i]<<" ";
}
cout<<endl;
//p=0;
}
void FIFO()
{
cout<<"先进先出算法:"<<endl;
int p=0;
int nm=0;
for(int i=0;i<num;i++)
{
if(Haven(page[i])!=(-1))
{
nm++;
}
else
{
block[p].num=page[i];
p=(++p)%bnum;
}
for(int j=0;j<bnum;j++)
{
if(block[j].num!=0)
{
cout<<block[j].num<<" ";
}
}
cout<<endl;
}
cout<<"命中率为:"<<(double)nm/(double)num<<endl;
}
int Haven(int n)
{
for(int i=0;i<bnum;i++)
{
if(block[i].num==n)
{
return i;
}
}
return -1;
}
void LRU()
{
int p=0;
int nm=0;
for(int i=0;i<bnum;i++)
{
block[i].num=0;
block[i].visited=false;
}
for(int i=0;i<num;i++)
{
int temp=Haven(page[i]);
if(temp!=(-1))
{
block[temp].visited=true;
nm++;
}
else
{
//int j=0;
while(1)
{
if(block[p].visited==false)
{
block[p].num=page[i];
p=(++p)%bnum;
break;
}
else
{
block[p].visited=false;
p=(++p)%bnum;
}
}
}
for(int j=0;j<bnum;j++)
{
if(block[j].num!=0)
{
cout<<block[j].num<<" ";
}
}
cout<<endl;
}
cout<<"命中率为:"<<(double)nm/(double)num<<endl;
}
void SLRU()
{
int p=0;
int nm=0;
for(int i=0;i<bnum;i++)
{
block[i].num=0;
block[i].visited=false;
}
for(int i=0;i<num;i++)
{
int temp=Haven(page[i]);
if(temp!=(-1))
{
block[temp].visited=true;
nm++;
}
else
{
for(int j=0;j<bnum;j++)
{
if(block[p].visited==false&&block[p].changed==false)
{
block[p].num=page[i];
if(rand()%2)
{
block[p].changed=true;
}
p=(++p)%bnum;
goto over;
}
else
{
block[p].visited=false;
p=(++p)%bnum;
}
}
while(1)
{
if(block[p].changed==false)
{
block[p].num=page[i];
p=(++p)%bnum;
break;
}
else
{
block[p].changed=false;
p=(++p)%bnum;
}
}
}
over: for(int j=0;j<bnum;j++)
{
if(block[j].num!=0)
{
cout<<block[j].num<<" ";
}
}
cout<<endl;
}
cout<<"命中率为:"<<(double)nm/(double)num<<endl;
}
~Allocation(void)
{
}
};
磁盘调度算法(C++)
磁盘调度算法
#pragma once
#include <string>
using namespace std;
class Element
{
public:
string name;
int value;
bool visited;
Element(void)
{
name="";
value=0;
visited=false;
}
void set(string n,int v)
{
name=n;
value=v;
visited=false;
}
~Element(void)
{
}
};
joseph环的C++实现
joseph环的C++实现
运行环境:Visual Studio 2005
关于CPU调度算法源码 C++
非抢占短进程优先
优先级调度
多级反馈调度
运行环境 Visual Studio 2005
语言:C++