@@ -105,6 +105,79 @@ private void GreateAddMap()//创建一个加号性质的图
105105 preGraph .AddEdgle (new Edgle ("null" ,preGraph .GetEndnode (),preGraph .GetStartnode ()));
106106 GStack .push (preGraph );//入栈
107107 }
108+ else ErrorRep ();
109+ }
110+ private void GreateQueMap ()//创建一个问号性质的图
111+ {
112+ if (!GStack .isEmpty ())
113+ {
114+ Graph preGraph =GStack .pop ();
115+ //增加一条直达边
116+ preGraph .AddEdgle (new Edgle ("null" ,preGraph .GetStartnode (),preGraph .GetEndnode ()));
117+ GStack .push (preGraph );//将新生成的栈入栈
118+ }
119+ }
120+ private void GreateAsteriskMap ()//创建星号map 闭包增加两条边,起始到终点,终点到起始
121+ {
122+ if (!GStack .isEmpty ())
123+ {
124+ Graph preGraph =GStack .pop ();
125+ //增加一条直达边
126+ preGraph .AddEdgle (new Edgle ("null" ,preGraph .GetStartnode (),preGraph .GetEndnode ()));
127+ preGraph .AddEdgle (new Edgle ("null" ,preGraph .GetEndnode (),preGraph .GetStartnode ()));
128+ GStack .push (preGraph );//将新生成的栈入栈
129+ }
130+ else ErrorRep ();
131+ }
132+ private void GreateAndMap ()
133+ {
134+ if (!GStack .isEmpty ())
135+ {
136+ Graph frontGraph =GStack .pop ();
137+ if (!GStack .isEmpty ())
138+ {
139+ Graph rearGraph =GStack .pop ();
140+ //将后取的图的end节点与先取图的开始节点连接
141+ Graph newGraph =new Graph (rearGraph .GetStartnode (),frontGraph .GetEndnode ());
142+ for (Node nd : rearGraph .getMap ().keySet ())
143+ for (int i =0 ;i <rearGraph .getMap ().get (nd ).size ();i ++)
144+ newGraph .AddEdgle (rearGraph .getMap ().get (nd ).get (i ));
145+ for (Node nd : frontGraph .getMap ().keySet ())
146+ for (int i =0 ;i <frontGraph .getMap ().get (nd ).size ();i ++)
147+ newGraph .AddEdgle (frontGraph .getMap ().get (nd ).get (i ));
148+ newGraph .AddEdgle (new Edgle ("null" ,rearGraph .GetEndnode (),frontGraph .GetStartnode ()));
149+ GStack .push (newGraph );
150+ }
151+ else ErrorRep ();
152+ }
153+ else ErrorRep ();
154+ }
155+ private void GreateOrMap ()
156+ {
157+ if (!GStack .isEmpty ())
158+ {
159+ Graph frontGraph =GStack .pop ();
160+ if (!GStack .isEmpty ())
161+ {
162+ Graph rearGraph =GStack .pop ();
163+ //新建立一个起始点与一个结束点
164+ Graph newGraph =new Graph (new Node (Node .getSum ()),new Node (Node .getSum ()));
165+ //起始点将两个图的起始点连接
166+ newGraph .AddEdgle (new Edgle ("null" ,newGraph .GetStartnode (),rearGraph .GetStartnode ()));
167+ newGraph .AddEdgle (new Edgle ("null" ,newGraph .GetStartnode (),frontGraph .GetStartnode ()));
168+ for (Node nd : rearGraph .getMap ().keySet ())
169+ for (int i =0 ;i <rearGraph .getMap ().get (nd ).size ();i ++)
170+ newGraph .AddEdgle (rearGraph .getMap ().get (nd ).get (i ));
171+ for (Node nd : frontGraph .getMap ().keySet ())
172+ for (int i =0 ;i <frontGraph .getMap ().get (nd ).size ();i ++)
173+ newGraph .AddEdgle (frontGraph .getMap ().get (nd ).get (i ));
174+ newGraph .AddEdgle (new Edgle ("null" ,rearGraph .GetEndnode (),newGraph .GetEndnode ()));
175+ newGraph .AddEdgle (new Edgle ("null" ,frontGraph .GetEndnode (),newGraph .GetEndnode ()));
176+ GStack .push (newGraph );
177+ }
178+ else ErrorRep ();
179+ }
180+ else ErrorRep ();
108181 }
109182 public void RegularExtract ()//正则表达式提取,图的创建
110183 {
@@ -134,10 +207,10 @@ public void RegularExtract()//正则表达式提取,图的创建
134207 switch (sub )
135208 {
136209 case "+" :GreateAddMap ();break ;
137- case "?" :break ;
138- case "*" :break ;
139- case "&" :break ;
140- case "|" :break ;
210+ case "?" :GreateQueMap (); break ;
211+ case "*" :GreateAsteriskMap (); break ;
212+ case "&" :GreateAndMap (); break ;
213+ case "|" :GreateOrMap (); break ;
141214 default :ErrorRep ();
142215 }
143216 }
0 commit comments