C++ 作业(哈夫曼树)

#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
;
map<char,string> mp;
map<string,char> pm;
struct pos
{
     char x;
     int num;
     pos *father=NULL;
     pos *lson=NULL;
     pos *rson=NULL;
     pos *p=NULL;
     friend bool operator < (pos a, pos b)
     {
        return a.num > b.num;    //重载小于号使得小的先出队列
     }
}tree[maxn];

void make_DFS(pos &root,string ss)
{
    if(root.lson==NULL && root.rson==NULL)
    {
        //cout<<root.x<<endl;
        mp[root.x]=ss;
        pm[ss]=root.x;
    }
    else
    {
        make_DFS(*root.lson,ss+");
        make_DFS(*root.rson,ss+");
    }
}
void build_tree(pos &root)
{
    priority_queue<pos> qu;  //  pos 结构体
    ;i<=;i++)
    {
        qu.push(tree[i]);
    }
    while(!qu.empty())
    {
        pos *qq;
        qq=qu.top().p;
        qu.pop();
        pos *pp;
        pp=qu.top().p;
        qu.pop();
       )
       {
           root.lson=pp;
           root.rson=qq;
           break;
       }
        (*pp).father=new pos;
        pos *x=(*pp).father;
        (*x).lson=pp;
        (*x).rson=qq;
        (*x).x='*';
        (*x).num=(*pp).num+(*qq).num;
        //cout<<(*x).num<<endl;
        (*x).p=&(*x);

        qu.push(*x);
    }
    //cout<<"make tree   OK"<<endl;
    make_DFS(root,"");
}
int32_t main()
{
            freopen("tree.txt","r",stdin);
            tree[].x=' ';
            ;i<=;i++)  cin>>tree[i].x;
            ;i<=;i++)  cin>>tree[i].num;
            ;i<=;i++)  tree[i].p=&tree[i];
            pos root;
            build_tree(root);
            ;i<=;i++)
            {
                 cout<<tree[i].x<<"   "<<tree[i].num<<"   "<<mp[tree[i].x]<<"   "<<pm[mp[tree[i].x]]<<endl;
            }
            ];
            getchar();gets(a);  cout<<a<<endl;   int l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            cout<<"----------------------------------------"<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;  string ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;

}
上一篇:docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面


下一篇:防止IFRAME页被嵌套