Ejemplo n.º 1
0
        //=======================三目运算符弄一下==============================



        public List <String> Test4(String LaTeX)
        {
            //开始层次遍历
            List <String>  list     = new List <String>();
            BinaryTreeNode bnode    = new BinaryTreeNode();
            FinalNode1     root     = new FinalNode1();
            FinalNode1     tempNode = new FinalNode1();

            root = bnode.getNode(LaTeX);


            //Console.WriteLine("来看看第一个节点:" + root.zifu);

            root.xuhao = 1;
            tempNode   = root;//临时指向根结点
            Queue <FinalNode1> q = new Queue <FinalNode1>();

            q.Enqueue(root);

            //Console.WriteLine("下一个来看看第一个节点:" + q.First().zifu);

            while (q.Count != 0)
            {
                //指向队列第一个字符
                tempNode = q.First();



                //Console.WriteLine("什么鬼啊下下一个来看看第一个节点:" + tempNode.zifu);

                //下面这个再加个判断就行了就是if(tempNode.left == null && tempNode.right == null),tempNode就是出队节点


                //=======!!!!!!!!!!!!!!这里注意:因为有根号的了,所以不能直接判断左右为空,而我根号默认是左节点!!!!!!!!!!!!!!!!!
                //第一种情况是:可交换运算符且左右都不空
                if ((tempNode.left != null && tempNode.right != null && JiaoHuanOperator(tempNode.zifu)))
                {
                    String strs1 = "";
                    String strs2 = "";



                    strs1 = Test5(tempNode.left) + tempNode.left.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.right) + tempNode.right.Flag;//



                    strs2 = Test5(tempNode.right) + tempNode.right.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.left) + tempNode.left.Flag;

                    list.Add(strs1);
                    list.Add(strs2);

                    //Console.WriteLine("第一种情况:" + tempNode.zifu);
                    //Console.WriteLine("============第一种情况=================");
                }

                //第二种情况是:不可交换运算符且左右都不空,类似减号
                if ((tempNode.left != null && tempNode.right != null && !JiaoHuanOperator(tempNode.zifu)))
                {
                    String strs1 = "";


                    strs1 = Test5(tempNode.left) + tempNode.left.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.right) + tempNode.right.Flag;//

                    list.Add(strs1);

                    //Console.WriteLine("============第二种情况=================");
                    //Console.WriteLine("第二种情况:" + tempNode.zifu);
                }

                //第三种情况:类似根号形式的
                if ((tempNode.left != null && tempNode.right == null && !JiaoHuanOperator(tempNode.zifu)))
                {
                    String strs1 = "";
                    strs1 = tempNode.zifu + tempNode.Flag + "#" + Test5(tempNode.left) + tempNode.left.Flag;// "+","左节点"
                    list.Add(strs1);

                    //Console.WriteLine("这里应该是根号:" + tempNode.zifu);
                    //Console.WriteLine("============第三种情况=================");
                }



                //第一个节点出队
                q.Dequeue();

                if (tempNode.left != null)
                {
                    //tempNode.left.xuhao = tempNode.xuhao * 2;
                    //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao);
                    q.Enqueue(tempNode.left);
                }
                if (tempNode.right != null)
                {
                    //tempNode.right.xuhao = tempNode.xuhao * 2 + 1;
                    //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao);
                    q.Enqueue(tempNode.right);
                }
            }

            return(list);
        }
Ejemplo n.º 2
0
        ////我把第一篇论文的实验数据的子式写入数据库吧
        //public void Test3()
        //{
        //    //         LaTeX,子式节点
        //    Dictionary<AAAAData, List<String>> dic = new Dictionary<AAAAData, List<String>>();
        //    StreamReader sr = new StreamReader("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\1.txt", Encoding.Default);
        //    String read = sr.ReadLine();
        //    //第一步:开始读取每一个数学表达式了啊
        //    while (read != null)
        //    {
        //        //第二步:直接构成倒排索引吧,省的以后要是有重复的数学表达式啥的
        //        //对于输入进来的每一个数学公式,把它解析为各个子式
        //        List<AAAAData> li = new List<AAAAData>();
        //        li = Test4(read);
        //        int biaozhi = 0;//每进来一个子式,就记作一个标志
        //        //对于每一个子式节点,我需要插入字典,作为倒排索引
        //        foreach (var it in li)
        //        {
        //            //if (dic.Count == 0)
        //            //{
        //            //    List<String> list = new List<string>();
        //            //    list.Add(read);
        //            //    dic.Add(it,list);
        //            //    Console.WriteLine("第一个if");
        //            //}
        //            //else
        //            //{
        //            //    //我去遍历字典的键值对象
        //            //    foreach (var zidian in dic)
        //            //    {
        //            //        //如果字典里面的倒排索引有某一个子式了
        //            //        if (zidian.Key.Equals(it) && (biaozhi == 0))
        //            //        {
        //            //            Console.WriteLine("第二个if");
        //            //            dic[zidian.Key].Add(read);
        //            //            biaozhi++;
        //            //        }
        //            //        else if(!zidian.Key.Equals(it))
        //            //        {
        //            //            List<String> list = new List<string>();
        //            //            list.Add(read);
        //            //            dic.Add(it, list);
        //            //        }
        //            //    }
        //            //}
        //            //==========================================================
        //            if (dic.Count == 0)
        //            {
        //                List<String> list = new List<string>();
        //                list.Add(read);
        //                dic.Add(it, list);
        //                continue;
        //            }
        //            int a = 0;//这是个判断标志,下面开始遍历,如果找到,那么a=1,没找到a=0
        //            AAAAData tempKey = null;//定义临时键存储文件名字
        //            foreach (var item in dic)
        //            {
        //                if (item.Key.Equals(it))
        //                {
        //                    a = 1;
        //                    tempKey = item.Key;//其实不用定义,因为如果找到,indexes.FileName与item.Key相等,下面那个“[]中括号”找谁不都一样么,多此一举
        //                    break;//一旦找到说明找到了,那么就可以终止了,此时等于一加个break,否则又出bug了
        //                }
        //            }
        //            if (a == 1)//说明找到了
        //            {
        //                dic[tempKey].Add(read);
        //            }
        //            else if (a == 0)//说明没找到
        //            {
        //                List<String> list = new List<string>();
        //                list.Add(read);
        //                dic.Add(it, list);
        //            }
        //            //==========================================================
        //        }//循环里面
        //        read = sr.ReadLine();
        //    }
        //    ////这里把数据倒排插入数据库
        //    //bool panduan;
        //    //string sqlstr = "insert into Test1(子式,子式所在高度,数学表达式) values ('" + node + "','" + filename + "','" + path + "')";
        //    //panduan = DBhelper.InsertUpdateDal(sqlstr);
        //    //if (panduan == true)
        //    //{
        //    //    Console.Write("操作成功");
        //    //}
        //    //else
        //    //{
        //    //    Console.Write("操作失败");
        //    //}
        //}



        //我先试一试获取数学表达式子式



        public List <AAAAData> Test4(String LaTeX)
        {
            //开始层次遍历
            List <AAAAData> list     = new List <AAAAData>();
            BinaryTreeNode  bnode    = new BinaryTreeNode();
            FinalNode1      root     = new FinalNode1();
            FinalNode1      tempNode = new FinalNode1();

            root = bnode.getNode(LaTeX);


            //Console.WriteLine("来看看第一个节点:" + root.zifu);

            root.xuhao = 1;
            tempNode   = root;//临时指向根结点
            Queue <FinalNode1> q = new Queue <FinalNode1>();

            q.Enqueue(root);

            //Console.WriteLine("下一个来看看第一个节点:" + q.First().zifu);

            while (q.Count != 0)
            {
                //指向队列第一个字符
                tempNode = q.First();



                //Console.WriteLine("什么鬼啊下下一个来看看第一个节点:" + tempNode.zifu);

                //下面这个再加个判断就行了就是if(tempNode.left == null && tempNode.right == null),tempNode就是出队节点


                //=======!!!!!!!!!!!!!!这里注意:因为有根号的了,所以不能直接判断左右为空,而我根号默认是左节点!!!!!!!!!!!!!!!!!
                if ((tempNode.left != null && tempNode.right != null) || (tempNode.left != null && tempNode.right == null))
                {
                    AAAAData data = new AAAAData();
                    data.BTLevel = tempNode.BTreeLevel;
                    data.str     = Test5(tempNode);
                    list.Add(data);

                    //Console.WriteLine("这里应该是根号:" + tempNode.zifu);
                }


                //第一个节点出队
                q.Dequeue();

                if (tempNode.left != null)
                {
                    tempNode.left.xuhao = tempNode.xuhao * 2;
                    //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao);
                    q.Enqueue(tempNode.left);
                }
                if (tempNode.right != null)
                {
                    tempNode.right.xuhao = tempNode.xuhao * 2 + 1;
                    //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao);
                    q.Enqueue(tempNode.right);
                }
            }

            return(list);
        }
Ejemplo n.º 3
0
        //重新写结构
        public void WriteStructure()
        {
            StreamReader sr   = new StreamReader("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\1.txt", Encoding.Default);
            StreamWriter sw   = new StreamWriter("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\2.txt");
            String       read = sr.ReadLine();


            while (read != null)
            {
                //开始层次遍历
                Dictionary <int, List <String> > dic = new Dictionary <int, List <string> >();
                BinaryTreeNode bnode    = new BinaryTreeNode();
                FinalNode1     root     = new FinalNode1();
                FinalNode1     tempNode = new FinalNode1();



                root       = bnode.getNode(read);
                root.xuhao = 1;
                tempNode   = root;//临时指向根结点
                Queue <FinalNode1> q = new Queue <FinalNode1>();
                q.Enqueue(root);
                while (q.Count != 0)
                {
                    //指向队列第一个字符
                    tempNode = q.First();

                    if (dic.Count == 0)
                    {
                        List <String> list = new List <string>();
                        list.Add(tempNode.zifu + "1" + "1");
                        dic.Add(tempNode.BTreeLevel, list);
                    }
                    else
                    {
                        if (dic.ContainsKey(tempNode.BTreeLevel))
                        {
                            if (isOperator(tempNode.zifu))
                            {
                                dic[tempNode.BTreeLevel].Add(tempNode.zifu + tempNode.BTreeLevel + tempNode.xuhao);
                            }
                            else
                            {
                                dic[tempNode.BTreeLevel].Add("$" + tempNode.BTreeLevel + tempNode.xuhao);
                            }
                        }
                        else
                        {
                            if (isOperator(tempNode.zifu))
                            {
                                List <String> list = new List <string>();
                                list.Add(tempNode.zifu + tempNode.BTreeLevel + tempNode.xuhao);
                                dic.Add(tempNode.BTreeLevel, list);
                            }
                            else
                            {
                                List <String> list = new List <string>();
                                list.Add("$" + tempNode.BTreeLevel + tempNode.xuhao);
                                dic.Add(tempNode.BTreeLevel, list);
                            }
                        }
                    }
                    //第一个节点出队
                    q.Dequeue();

                    if (tempNode.left != null)
                    {
                        tempNode.left.xuhao = tempNode.xuhao * 2;
                        //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao);
                        q.Enqueue(tempNode.left);
                    }
                    if (tempNode.right != null)
                    {
                        tempNode.right.xuhao = tempNode.xuhao * 2 + 1;
                        //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao);
                        q.Enqueue(tempNode.right);
                    }
                }



                //开始写了
                String str = null;
                foreach (var it in dic)
                {
                    String text = "";
                    foreach (var itt in it.Value)
                    {
                        text = text + itt;
                    }
                    str = str + text + "#";
                }

                str = str + read;

                Console.WriteLine("结果为:" + str);
                sw.WriteLine(str);

                read = sr.ReadLine();
            }//读取内容

            sw.Flush();
        }