• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            #include <cstdio>
            #include 
            <algorithm>
            #include 
            <vector>
            #include 
            <queue>
            #include 
            <string>

            using namespace std;

            struct HTNode
            {
                
            int weight, letter, lchild, rchild;
                
                HTNode(){}
                HTNode( 
            int a, int b, int c, int d ) :weight(a), letter(b), lchild(c), rchild(d) {}
            };

            struct  Info
            {
                
            int  num, lett, id;
                Info();
                Info( 
            int a, int c,  int b ): num(a), lett(c), id(b) {}
            };

            bool operator< ( Info const& a, Info const& b )
            {
                
            return a.num> b.num;
            }

            int     num[26], len= 0, root;
            char    str[1000];
            string  code[26];
            vector
            <HTNode>  ht;
            priority_queue
            <Info>  info;

            void buildtree();
            void codeht(int,string);
            void decode( int,int);

            void input()                                  //  輸入過程 
            {
                printf(
            "注意:  該程序只處理大寫字母, 其它字符不予處理\n");
                printf(
            "請輸入文本, 在最后另起一行按  F6  結(jié)束輸入:\n");
                
            char ch;
                
                memset( num, 
            0sizeof(num) );
                
            while( scanf("%c",&ch)!= EOF )
                    
            if( ch>= 'A' && ch<= 'Z' )  num[ch- 'A']++;
                    
                printf(
            "各字母個數(shù)為:\n");
                
            for(int i= 0; i< 26++i )
                
            if( num[i] ) printf("%c  %d\n", i+ 'A', num[i] ); 
            }

            void test()
            {
                input();
                buildtree();
                codeht( root, 
            "" );
                
                printf(
            "各字母的哈夫曼編碼為:\n\n"); 
                
            forint i= 0; i< 26++i )
                
            if( num[i] ) printf("%c  %s\n", i+ 'A', code[i].c_str() );
                
                printf(
            "\n\n\n請輸入你要解碼的字符串,不能有空格,并且輸入合法\n"); 
                scanf(
            "%s", str );
                
                printf(
            "解碼后為:\n\n"); 
                
                decode(
            0, root ); 
                printf(
            "\n\n\n");
            }

            void codeht( int i, string s )                    //   編碼過程 
            {
                
            if( ht[i].lchild== -1 )  
                {
                    code[ ht[i].letter ]
            = s;
                }
                
            else
                {
                    codeht( ht[i].lchild, s
            + '0' );
                    codeht( ht[i].rchild, s
            + '1' );
                }
            }

            void decode( int i, int j )                      //   解碼過程 
            {
                
            if( ht[j].lchild== -1 && ht[j].rchild== -1 )
                {
                    printf(
            "%c", ht[j].letter+ 'A' );
                    
            if( str[i] ) decode( i, root );
                }
                
            else if!str[i] ) return;
                
            else if( str[i]== '0' )      decode( i+ 1, ht[j].lchild );
                
            else if( str[i]== '1' )      decode( i+ 1, ht[j].rchild );
            }

            void buildtree()                                //   建樹過程 
            {
                len
            = 0;
                
            forint i= 0; i< 26++i )
                
            if( num[i] )
                {
                    ht.push_back( HTNode( num[i], i, 
            -1-1 ) );
                    info.push( Info( num[i], i, len
            ++ ) );
                }
                
                
            if( info.size()== 1 ) {  root= 0;  return;  }
                
                Info  a
            = info.top();  info.pop();
                Info  b
            = info.top();  info.pop();
                
                info.push( Info( a.num
            + b.num, -1, len++ ) );
                ht.push_back( HTNode( a.num
            + b.num, -1, a.id, b.id ) );
                
                
            while( info.size()> 1 )
                {
                    Info a
            = info.top(); info.pop();
                    Info b
            = info.top(); info.pop();
                    
                    info.push( Info( a.num
            + b.num, -1, len++ ) );
                    ht.push_back( HTNode( a.num
            + b.num, -1, a.id, b.id ) );
                }    
                
                root
            = info.top().id;
            }

            int main()
            {
                test();
                
                system(
            "pause");
                
            return 0;
            }

            /*

            7 5 2 4 6

            */
            posted on 2008-11-12 21:03 Darren 閱讀(294) 評論(0)  編輯 收藏 引用
            中文精品久久久久人妻不卡| 大香网伊人久久综合网2020| 久久久午夜精品福利内容| 日产久久强奸免费的看| 亚洲精品无码久久一线| 东京热TOKYO综合久久精品| 国产高清国内精品福利99久久| 色99久久久久高潮综合影院| 久久午夜无码鲁丝片| 久久无码人妻精品一区二区三区| 久久影院综合精品| 亚洲精品99久久久久中文字幕| 久久精品99久久香蕉国产色戒| 性做久久久久久久久| 久久精品人人做人人爽电影| 精品人妻伦九区久久AAA片69| 精品久久久久久国产三级| 久久久久久亚洲AV无码专区| 欧美亚洲国产精品久久久久| 久久国产精品免费一区| 久久噜噜电影你懂的| 久久天天躁狠狠躁夜夜avapp| 久久久久久久国产免费看| 久久99精品综合国产首页| 亚洲日韩中文无码久久| 亚洲国产成人精品女人久久久| 91精品观看91久久久久久 | 亚洲va国产va天堂va久久| 久久久久亚洲精品无码网址| 国产成人99久久亚洲综合精品| 国产精品无码久久久久久| 亚洲中文久久精品无码| 久久久久国产精品嫩草影院| 色综合久久天天综线观看| 成人亚洲欧美久久久久| 国产综合成人久久大片91| 精品熟女少妇aⅴ免费久久| 99久久国产亚洲高清观看2024 | 狠狠色丁香婷婷久久综合五月| 青青青青久久精品国产h久久精品五福影院1421| 国内精品久久久久影院优|