资源简介
C++信号放大器
(1) 运用二叉树的定义将左孩子、右孩子、结点值、权值即与父结点的衰减量、以及当前结点的最大衰减量联系起来。
(2) 设置信号放大器函数
该函数主要实现判断是否超过容忍值并在合适位置放置信号放大器使其数量最少。
首先将当前结点最大衰减量D初始化,当只有右子树时即左子树为空,计算出当前结点的最大衰减量,判断当超过容忍值时则放置信号放大器并输出;当只有左子树时即右子树为空,计算出当前结点的最大衰减量,判断当超过容忍值时则放置信号放大器并输出;当左右子树都存在并左子树的衰减量大于右子树时则计算当前结点最大衰减量D并判断是否超过容忍值并输出,继续进一步比较其右子树的当前最大衰减量与右子树的衰减量之和和其左子树的衰减量,若大于则更新D,并判断是否超过容忍值并输出,再进一步比较其右子树的衰减量与其左子树的衰减量,若大于则再更新D;当左右子树都存在且右子树的衰减量大于左子树时,比较方法与前者相似,颠倒左右即可。
通过此算法可将放置的放大器数目最少。
(3) 主函数
主函数中包括输入信息时的声明及相关函数的调用。
四 调试分析
该程序在设置信号放大器的比较算法上有些麻烦,需要进行很多比较。结点信息的输入也比较麻烦,很浪费时间,还有就是输出结果时最好将二叉树的具体结构一同输出便于检查,并且形象直观。
代码片段和文件信息
#include
using namespace std;
struct node //定义树的元素
{
struct node *lchild;
struct node *rchild;
char data ;
int weight;
int D; //当前衰减量最大值
};
typedef struct node * BTREE ;
typedef enum{L R} tagtype;
typedef struct
{
BTREE ptr;
tagtype tag;
}stacknode;
typedef struct
{
stacknode Elem[100];
int top;
} Stack;
stacknode Pop( Stack &S )
{
stacknode c;
c=S.Elem[ S.top ];
S.top = S.top - 1 ;
return c;
}
void Push ( stacknode x Stack &S )
{
S.top = S.top + 1 ;
S.Elem[ S.top ] = x ;
}
typedef struct
{
char data parent tag ;
int weight;
} Bnode;
typedef struct //队列
{
BTREE ele[100];
int frontrear;
}Squeue;
void Makenull ( Squeue &Q)
{
Q.front = 0;
Q.rear =99;
}
BTREE CreatBT( ) //按逻辑结构建立二叉树,依次输入结点、父结点、标号、权值
{
cout<<“请按逻辑结构输入二叉树“< Bnode p;
Squeue q;
BTREE root s;
root=new node;
root=NULL;
Makenull(q);
cin>>p.data>>p.parent>>p.tag>>p.weight;
while (p.data!=‘0‘)
{
s=new node;
s->data=p.data;
s->weight=p.weight;
s->lchild=s->rchild=NULL;
q.rear=(q.rear+1)%100;
q.ele[q.rear]=s;
if (p.parent==‘0‘)
root=s;
else
{
while (q.rear+1%100!=q.front&&q.ele[q.front]->data!=p.parent)
q.front=(q.front+1)%100;
if (q.ele [q.front]->data==p.parent)
{
if (p.tag==‘L‘)
q.ele[q.front]->lchild=s;
else
q.ele[q.front]->rchild=s;
}
}
cin>>p.data>>p.parent>>p.tag>>p.weight;
}
return root;
}
void Amplifier(BTREE sbint tol) //设置信号放大器函数
{
BTREE t;
Stack s;
stacknode x;
s.top=0;
t=sb;
do
{
while (t!=NULL)
{
x.ptr = t;
x.tag = L;
Push(xs);
t=t->lchild;
}
while (s.top!=0&& s.Elem[s.top].tag==R)
{
x = Pop(s);
t = x.ptr;
if (t->lchild==NULL&&t->rchild==NULL)
{
t->D=0; //初始化
}
else if (t->lchild==NULL&&t->rchild!=NULL)
{
t->D=t->rchild->D+t->rchild->weight; //只有右子树时当前最大衰减量
if (t->D>tol) //大于容忍值则设置放大器
{
cout<<“应该放置放大器的结点为:“;
cout<rchild->data< t->D=t->rchild->weight;
}
}
else if (t->lchild!=NULL&&t->rchild==NULL) //只有左子树时当前最大衰减量
{
t->D=t->lchild->D+t->lchild->weight;
if (t->D>tol) //大于容忍值则放置放大器
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-01-03 14:30 信号放大器\
文件 6389 2012-01-03 12:37 信号放大器\信号放大器.cpp
文件 477418 2012-01-03 12:42 信号放大器\信号放大器.exe
文件 24576 2012-01-03 13:19 信号放大器\信号放大器说明.doc
文件 33280 2012-01-03 13:20 信号放大器\课程设计报告.doc
- 上一篇:编译原理用C++消除左递归
- 下一篇:打地鼠 源码
评论
共有 条评论