矢量算法
① 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
using namespace std;
bool isOp(string& op){
if(op==("+")||op==("-")||op==("*")||op==("/")||op==("(")||op==(")")) return true;
else return false;
}
int pri(string& op){
if(op==("+")||op==("-")||op==("(")) return 1;
else if(op==("*")||op==("/")) return 2;
else return 0;
}
string twoResult(string& op,string& a,string& b){
double x=atof(b.c_str()),y=atof(a.c_str()),z=0;
string result;
stringstream ss;
if(op==("+")) z=x+y;
else if(op==("-")) z=x-y;
else if(op==("*")) z=x*y;
else if(op==("/")) z=x/y;
else z=0;
ss<<z;ss>>result;
return result;
}
vector<string> read(string input){
vector<string> exp;
const string op="+-*/()";
static const basic_string <string>::size_type npos=-1;
for(int i=0,pos=0;i<input.length();i++){
if(op.find(input[i])!=npos){
if(op.find(input[pos])==npos){
exp.push_back(input.substr(pos,i-pos));
}
exp.push_back(input.substr(i,1));
pos=i+1;
continue;
}
if(i==input.length()-1 && op.find(input[i])==npos){
exp.push_back(input.substr(pos));
}
}
return exp;
}
vector<string> toRight(vector<string>& exp){
stack<string> as;
vector<string> right;
string op;
int pos=0;
while(true){
if(isOp(exp.at(pos))){
if(as.empty()||(exp.at(pos))==("(")){
as.push(exp.at(pos));
}
else{
if((exp.at(pos))==(")")){
if((as.top())!=("(")){
op=as.top();as.pop();
right.push_back(op);
}
}
else{
if(pri(exp.at(pos))<=pri(as.top())&&(!as.empty())){
op=as.top();as.pop();
if(op!=("(")) right.push_back(op);
}
as.push(exp.at(pos));
}
}
}
else right.push_back(exp.at(pos));
pos++;
if(pos>=exp.size()) break;
}
while(!as.empty()){
op=as.top();as.pop();
right.push_back(op);
}
return right;
}
double getResult(vector<string>& right){
stack<string> temp;
string op1,op2;
vector<string>::iterator v_it;
for(v_it=right.begin();v_it!=right.end();v_it++){
if(isOp(*v_it)){
op1=temp.top();temp.pop();
op2=temp.top();temp.pop();
temp.push(twoResult(*v_it,op1,op2));
}
else temp.push(*v_it);
}
return atof(temp.top().c_str());
}
void main(){
string input;
for(;;){
cout<<"输入表达式或输入Q退出:";
cin>>input;
if(input==("q")) break;
else{
vector<string> exp=read(input);
cout<<input<<"="<<getResult(toRight(exp))<<endl;
}
}
}
② 距离矢量算法是不是也叫距离向量算法
是的,矢量和向量是一个概念,在物理学中叫作矢量,在数学中叫做向量。
③ 距离矢量路由算法为什么会出现计数到无穷
所谓距离矢量即是将一条路由信息考虑成一个由目标和距离(用 Metric 来度量)组称的矢量,每一台路由器从其邻居处获得路由信息,并在每一条路由信息上叠加从自己到这个邻居的距离矢量,从而形成自己的路由信息。 在一个链路状态路由选择中,一个结点检查所有直接链路的状态,并将所得的状态信息发送给网上所有的其他的结点,而不仅仅是发给那些直接相连的结点。每个节点都用这种方式,所有其他的结点从网上接收包含直接链路状态的路由信息。 每当链路状态报报文到达时,路由结点便使用这些状态信息去更新自己的网路拓扑和状态“视野图”,一旦链路状态发生改变,结点对跟新的网络图利用Dijkstra最短路径算法重新计算路由,从单一的报源发出计算到达所有的结点的最短路径。 看明白了么?最简单理解。。距离矢量算法是静态的。。。链路状态路由算法是动态的,,随时改变的。。 距离矢量算法,一旦相邻节点发生故障,传输就出终止;链路状态路由算法,一旦相邻的一个节点发生故障,会自动转移数据包到另外的节点进行传输过程。
④ JAVA实现距离矢量算法
public static void main(String[] args) {
new Jsq();
}
/* 利用构造进行实例化 */
public Jsq() {