zoukankan      html  css  js  c++  java
  • LZW算法的 C#实现

    LZW

    #undef debug
    #define debugdisplay
    #undef debugdictionary
    using System;
    using System.Collections;

    namespace LZW
    {
     public class cLZW
     {
      #region Constrcut
      public cLZW()
      {
      }
      #endregion
      
      #region Coding
      public string InCharStream
      {
       set { _InCharStream = value; }
       get {return _InCharStream; }
      }
      public ArrayList CodingCodeStream
      {
       get {return _CodingCodeStream;}
      }
      public ArrayList CodingDictionary
      {
       get {return _CodingDictionary;}
      }
      private void InitCodingDictionary()
      {
       _CodingDictionary.Clear();
    #if debug
       _CodingDictionary.Add("A");
       _CodingDictionary.Add("B");
       _CodingDictionary.Add("C");
    #else
       for(int i = 0; i < 256; i++)
       {
        _CodingDictionary.Add((char)i);
       }
    #endif
      }
      private void AddCodingDictionary(object str)
      {
       _CodingDictionary.Add(str);
      }
      private void AddCodingCodeStream(object str)
      {
       _CodingCodeStream.Add(str);
      }
      private bool ISInCodingDictionary(string Prefix)
      {
       bool result = false;
       int  count = _CodingDictionary.Count;
       for(int i = 0; i < count; i++)
       {
        string temp = _CodingDictionary[i].ToString();
        if (temp.IndexOf(Prefix) >= 0)
        {
         result = true;
         break;
        }
       }
       return result;
      }
      private string  GetIndexCodingDictionary(string Prefix)
      {
       string result ="0";
       int  count = _CodingDictionary.Count;
       for(int i = 0; i < count; i++)
       {
        string temp = _CodingDictionary[i].ToString();
        if (temp.IndexOf(Prefix) >= 0)
        {
         result = Convert.ToString(i + 1);
         break;
        }
       }
       return result;
      }
      private void DisplayCodingCodeStream()
      {
       System.Console.WriteLine("*********_CodingCodeStream************");
       for(int i = 0; i < _CodingCodeStream.Count; i++)
       {
        System.Console.WriteLine(_CodingCodeStream[i].ToString());
       }
      }
      private void DisplayCodingDictionary()
      {
       System.Console.WriteLine("*********_CodingDictionary************");
       for(int i = 0; i < _CodingDictionary.Count; i++)
       {
        System.Console.WriteLine(_CodingDictionary[i].ToString());
       }
      }
      private void DisplayInCharStream()
      {
       System.Console.WriteLine("*********_InCharStream************");
       System.Console.WriteLine(_InCharStream);
      }
      private void InitCodingCodeStream()
      {
       _CodingCodeStream.Clear();
      }
      private ArrayList _CodingDictionary = new ArrayList();
      private string _InCharStream = "";
      private ArrayList _CodingCodeStream = new ArrayList();
      public void Coding()
      {
       string Prefix ="" ;
       string c ="";
       string PrefixIndex= "0";
       int  count = _InCharStream.Length;
       if (count == 0) return ;
       InitCodingDictionary();
       InitCodingCodeStream();
       Prefix = _InCharStream[0].ToString();
       for(int i = 1; i < count; i++)
       {
        c = _InCharStream[i].ToString();
        if (ISInCodingDictionary( Prefix + c))
        {
         Prefix += c;
        }
        else
        {
         PrefixIndex = GetIndexCodingDictionary(Prefix);
         AddCodingCodeStream(PrefixIndex);
         AddCodingDictionary( Prefix + c);
         Prefix = c;
        }
       }
       PrefixIndex = GetIndexCodingDictionary(Prefix);
       AddCodingCodeStream(PrefixIndex);
    #if debugdisplay
       DisplayInCharStream();
       DisplayCodingCodeStream();
    #if debugdictionary
       DisplayCodingDictionary();
    #endif
    #endif
      }
      
      #endregion
      
      #region Decode
      private ArrayList _DeCodeDictionary = new ArrayList();
      private ArrayList _OutCharStream = new ArrayList();
      private int[] _DeCodeCodeStream ;
      public void SetDeCodeSCodetream(int[] obj)
      {
       int count = obj.Length;
       _DeCodeCodeStream = new int[count];
       for(int i =0; i < count ; i++)
       {
        _DeCodeCodeStream[i] = obj[i];
       }
      }
      public void SetDeCodeSCodetream(ArrayList obj)
      {
       int count = obj.Count;
       _DeCodeCodeStream = new int[count];
       for(int i =0; i < count ; i++)
       {
        _DeCodeCodeStream[i] = System.Convert.ToInt32(obj[i]);
       }
      
      }
      public int[] GetDeCodeCodeStream()
      {
       return _DeCodeCodeStream;
      }
      public string OutCharStream
      {
       get
       {
        string result = "";
        for(int i = 0,count = _OutCharStream.Count; i < count; i++)
        {
         result += _OutCharStream[i].ToString();
        }
        return result;
       }
      }
      public ArrayList DeCodeDictionary
      {
       get
       {
        return _DeCodeDictionary;
       }
      }
      private void InitDeCodeDictionary()
      {
       _DeCodeDictionary.Clear();
    #if debug
       _DeCodeDictionary.Add("A");
       _DeCodeDictionary.Add("B");
       _DeCodeDictionary.Add("C");
    #else
       for(int i = 0; i < 256; i++)
       {
        _DeCodeDictionary.Add((char)i);
       }
    #endif
      }
      private void InitOutCharStream()
      {
       _OutCharStream.Clear();
      }
      private void DisplayOutCharStream()
      {
       System.Console.WriteLine("*********_OutCharStream************");
       string temp = "";
       for(int i = 0; i < _OutCharStream.Count; i++)
       {
        temp = temp + (_OutCharStream[i].ToString());
       }
     
       System.Console.WriteLine(temp);
      }
      private void DisplayDeCodeDictionary()
      {
       System.Console.WriteLine("*********_DeCodeDictionary************");
       for(int i = 0; i < _DeCodeDictionary.Count; i++)
       {
        System.Console.WriteLine(_DeCodeDictionary[i].ToString());
       }
       
      }
      private void DisplayDeCodeCodeStream()
      {
       System.Console.WriteLine("*********_DeCodeCodeStream************");
       int count = _DeCodeCodeStream.Length;
       for(int i = 0; i < count; i++)
       {
        System.Console.WriteLine("{0}",_DeCodeCodeStream[i]);
       }
      }
      private void AddOutCharStream(object str)
      {
       _OutCharStream.Add(str);
      }
      private void AddDeCodeDictionary(object str)
      {
       _DeCodeDictionary.Add(str);
      }
      private bool ISInDeCodeDictionary(int cw)
      {
       bool result = false;
       int  count = _DeCodeDictionary.Count;
       if (cw <= count - 1)
       {
        result = true;
       }
       return result;
      }
      public void Decode()
      {
       InitDeCodeDictionary();
       InitOutCharStream();
       int cw = 0;
       int pw = 0;
       string Prefix = "";
       string c="";
       cw = _DeCodeCodeStream[0] - 1;
       this.AddOutCharStream(this._DeCodeDictionary[cw]);
       pw = cw;
       int count = _DeCodeCodeStream.Length;
       if (count == 0) return;
       for(int i = 1; i < count; i++)
       {
        cw = _DeCodeCodeStream[i] - 1;
        if (ISInDeCodeDictionary(cw))
        {
         this.AddOutCharStream(this._DeCodeDictionary[cw]);
         Prefix = this._DeCodeDictionary[pw].ToString();
         c = (this._DeCodeDictionary[cw].ToString())[0].ToString();
         this.AddDeCodeDictionary(Prefix + c);
        }
        else
        {
         Prefix = this._DeCodeDictionary[pw].ToString();
         c = Prefix[0].ToString();
         this.AddOutCharStream(Prefix + c);
         this.AddDeCodeDictionary(Prefix + c);
        }
        pw = cw;
       }
    #if debugdisplay
       DisplayOutCharStream();
       DisplayDeCodeCodeStream();
    #if debugdictionary
       DisplayDeCodeDictionary();
    #endif
    #endif
      }
      #endregion
     }
    }

    #undef debug
    using System;

    namespace LZW
    {
     class Class1
     {
      [STAThread]
      static void Main(string[] args)
      {
       cLZW lzw = new cLZW();
       #if debug
       lzw.InCharStream = "ABBABABACCBBAAA";
       #else
       System.Console.WriteLine("Enter the Tests CharArray [a-zA-Z0-9]:");
       lzw.InCharStream = System.Console.ReadLine();
       #endif
       System.Console.WriteLine("The Coding ... ...");
       lzw.Coding();
       System.Console.WriteLine("The DeCode ... ...");
       lzw.SetDeCodeSCodetream(lzw.CodingCodeStream);
       lzw.Decode();
       System.Console.ReadLine();
      }
     }
    }



    ----------------------------------------------
    τ 认识你会不会是一种错误
    如果这是个错误 也应该是个美丽的错误
    但愿这个错误能够一辈子

    ______________ζ浮云¢惊龙
  • 相关阅读:
    搜索型SQL注入解决方法
    windows10系统下phpstudy安装php8版本
    齐博cms基础教程之认识齐博cms
    thinkphp查找父级栏目及子级栏目的所有文章
    phpstudy+iis搭建php项目
    python办公自动化基础搜索文件
    thinkphp屏蔽ip访问项目做法
    thinkphp使用paypal进行支付的做法详细步骤
    数据库无法插入数据解决方法
    tp5发送邮件适用于常用的php版本做法
  • 原文地址:https://www.cnblogs.com/bigmouthz/p/322548.html
Copyright © 2011-2022 走看看