本文整理汇总了C#中LinkedList.RemoveAndReturnFirst方法的典型用法代码示例。如果您正苦于以下问题:C# LinkedList.RemoveAndReturnFirst方法的具体用法?C# LinkedList.RemoveAndReturnFirst怎么用?C# LinkedList.RemoveAndReturnFirst使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LinkedList
的用法示例。
在下文中一共展示了LinkedList.RemoveAndReturnFirst方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetLiveStates
private HashSet<State> GetLiveStates(HashSet<State> states)
{
var dictionary = states.ToDictionary(s => s, s => new HashSet<State>());
foreach (State s in states)
{
foreach (Transition t in s.Transitions)
{
// TODO: Java code does not check for null states.
if (t.To == null)
{
continue;
}
dictionary[t.To].Add(s);
}
}
var comparer = new StateEqualityComparer();
var live = new HashSet<State>(this.GetAcceptStates(), comparer);
var worklist = new LinkedList<State>(live);
while (worklist.Count > 0)
{
State s = worklist.RemoveAndReturnFirst();
foreach (State p in dictionary[s])
{
if (!live.Contains(p))
{
live.Add(p);
worklist.AddLast(p);
}
}
}
return live;
}
示例2: GetStates
public HashSet<State> GetStates()
{
this.ExpandSingleton();
HashSet<State> visited;
if (this.IsDebug)
{
visited = new HashSet<State>(); // LinkedHashSet
}
else
{
visited = new HashSet<State>();
}
var worklist = new LinkedList<State>();
worklist.AddLast(this.Initial);
visited.Add(this.Initial);
while (worklist.Count > 0)
{
State s = worklist.RemoveAndReturnFirst();
if (s == null)
{
continue;
}
HashSet<Transition> tr = this.IsDebug
? new HashSet<Transition>(s.GetSortedTransitions(false))
: new HashSet<Transition>(s.Transitions);
foreach (Transition t in tr)
{
if (!visited.Contains(t.To))
{
visited.Add(t.To);
worklist.AddLast(t.To);
}
}
}
return visited;
}
示例3: GetAcceptStates
public HashSet<State> GetAcceptStates()
{
this.ExpandSingleton();
var accepts = new HashSet<State>();
var visited = new HashSet<State>();
var worklist = new LinkedList<State>();
worklist.AddLast(this.Initial);
visited.Add(this.Initial);
while (worklist.Count > 0)
{
State s = worklist.RemoveAndReturnFirst();
if (s.Accept)
{
accepts.Add(s);
}
foreach (Transition t in s.Transitions)
{
// TODO: Java code does not check for null states.
if (t.To == null)
{
continue;
}
if (!visited.Contains(t.To))
{
visited.Add(t.To);
worklist.AddLast(t.To);
}
}
}
return accepts;
}
示例4: AddEpsilons
/// <summary>
/// Adds epsilon transitions to the given automaton. This method adds extra character interval
/// transitions that are equivalent to the given set of epsilon transitions.
/// </summary>
/// <param name="a">The automaton.</param>
/// <param name="pairs">A collection of <see cref="StatePair"/> objects representing pairs of
/// source/destination states where epsilon transitions should be added.</param>
public static void AddEpsilons(Automaton a, ICollection<StatePair> pairs)
{
a.ExpandSingleton();
var forward = new Dictionary<State, HashSet<State>>();
var back = new Dictionary<State, HashSet<State>>();
foreach (StatePair p in pairs)
{
HashSet<State> to = forward[p.FirstState];
if (to == null)
{
to = new HashSet<State>();
forward.Add(p.FirstState, to);
}
to.Add(p.SecondState);
HashSet<State> from = back[p.SecondState];
if (from == null)
{
from = new HashSet<State>();
back.Add(p.SecondState, from);
}
from.Add(p.FirstState);
}
var worklist = new LinkedList<StatePair>(pairs);
var workset = new HashSet<StatePair>(pairs);
while (worklist.Count != 0)
{
StatePair p = worklist.RemoveAndReturnFirst();
workset.Remove(p);
HashSet<State> to = forward[p.SecondState];
HashSet<State> from = back[p.FirstState];
if (to != null)
{
foreach (State s in to)
{
var pp = new StatePair(p.FirstState, s);
if (!pairs.Contains(pp))
{
pairs.Add(pp);
forward[p.FirstState].Add(s);
back[s].Add(p.FirstState);
worklist.AddLast(pp);
workset.Add(pp);
if (from != null)
{
foreach (State q in from)
{
var qq = new StatePair(q, p.FirstState);
if (!workset.Contains(qq))
{
worklist.AddLast(qq);
workset.Add(qq);
}
}
}
}
}
}
}
// Add transitions.
foreach (StatePair p in pairs)
{
p.FirstState.AddEpsilon(p.SecondState);
}
a.IsDeterministic = false;
a.ClearHashCode();
a.CheckMinimizeAlways();
}
示例5: Intersection
/// <summary>
/// Returns an automaton that accepts the intersection of the languages of the given automata.
/// Never modifies the input automata languages.
/// </summary>
/// <param name="a1">The a1.</param>
/// <param name="a2">The a2.</param>
/// <returns></returns>
public static Automaton Intersection(Automaton a1, Automaton a2)
{
if (a1.IsSingleton)
{
if (a2.Run(a1.Singleton))
{
return a1.CloneIfRequired();
}
return BasicAutomata.MakeEmpty();
}
if (a2.IsSingleton)
{
if (a1.Run(a2.Singleton))
{
return a2.CloneIfRequired();
}
return BasicAutomata.MakeEmpty();
}
if (a1 == a2)
{
return a1.CloneIfRequired();
}
Transition[][] transitions1 = Automaton.GetSortedTransitions(a1.GetStates());
Transition[][] transitions2 = Automaton.GetSortedTransitions(a2.GetStates());
var c = new Automaton();
var worklist = new LinkedList<StatePair>();
var newstates = new Dictionary<StatePair, StatePair>();
var p = new StatePair(c.Initial, a1.Initial, a2.Initial);
worklist.AddLast(p);
newstates.Add(p, p);
while (worklist.Count > 0)
{
p = worklist.RemoveAndReturnFirst();
p.S.Accept = p.FirstState.Accept && p.SecondState.Accept;
Transition[] t1 = transitions1[p.FirstState.Number];
Transition[] t2 = transitions2[p.SecondState.Number];
for (int n1 = 0, b2 = 0; n1 < t1.Length; n1++)
{
while (b2 < t2.Length && t2[b2].Max < t1[n1].Min)
{
b2++;
}
for (int n2 = b2; n2 < t2.Length && t1[n1].Max >= t2[n2].Min; n2++)
{
if (t2[n2].Max >= t1[n1].Min)
{
var q = new StatePair(t1[n1].To, t2[n2].To);
StatePair r;
newstates.TryGetValue(q, out r);
if (r == null)
{
q.S = new State();
worklist.AddLast(q);
newstates.Add(q, q);
r = q;
}
char min = t1[n1].Min > t2[n2].Min ? t1[n1].Min : t2[n2].Min;
char max = t1[n1].Max < t2[n2].Max ? t1[n1].Max : t2[n2].Max;
p.S.Transitions.Add(new Transition(min, max, r.S));
}
}
}
}
c.IsDeterministic = a1.IsDeterministic && a2.IsDeterministic;
c.RemoveDeadTransitions();
c.CheckMinimizeAlways();
return c;
}
示例6: Determinize
/// <summary>
/// Determinizes the given automaton using the given set of initial states.
/// </summary>
/// <param name="a">The automaton.</param>
/// <param name="initialset">The initial states.</param>
public static void Determinize(Automaton a, List<State> initialset)
{
char[] points = a.GetStartPoints();
var comparer = new ListEqualityComparer<State>();
// Subset construction.
var sets = new Dictionary<List<State>, List<State>>(comparer);
var worklist = new LinkedList<List<State>>();
var newstate = new Dictionary<List<State>, State>(comparer);
sets.Add(initialset, initialset);
worklist.AddLast(initialset);
a.Initial = new State();
newstate.Add(initialset, a.Initial);
while (worklist.Count > 0)
{
List<State> s = worklist.RemoveAndReturnFirst();
State r;
newstate.TryGetValue(s, out r);
foreach (State q in s)
{
if (q.Accept)
{
r.Accept = true;
break;
}
}
for (int n = 0; n < points.Length; n++)
{
var set = new HashSet<State>();
foreach (State c in s)
foreach (Transition t in c.Transitions)
if (t.Min <= points[n] && points[n] <= t.Max)
set.Add(t.To);
var p = set.ToList();
if (!sets.ContainsKey(p))
{
sets.Add(p, p);
worklist.AddLast(p);
newstate.Add(p, new State());
}
State q;
newstate.TryGetValue(p, out q);
char min = points[n];
char max;
if (n + 1 < points.Length)
{
max = (char)(points[n + 1] - 1);
}
else
{
max = char.MaxValue;
}
r.Transitions.Add(new Transition(min, max, q));
}
}
a.IsDeterministic = true;
a.RemoveDeadTransitions();
}