/
AMHeap.cs
137 lines (116 loc) · 3.18 KB
/
AMHeap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using System;
using System.Collections.Generic;
using System.Text;
namespace Axiom.Runtime
{
public class AMHeap : AbstractDataArea
{
private int _variableIndex = 0;
private AbstractMachineState _state;
private HeapNode _extraItem;
private HeapNode _heap;
private HeapNode _previousItem;
private HeapNode _h;
public HeapNode H
{
get { return _h; }
set { _h = value; }
}
public AMHeap()
{
}
public void Push(HeapNode newItem)
{
if (newItem is AbstractTerm)
{
AbstractTerm at = newItem as AbstractTerm;
if (at.IsReference)
{
if (at.Name == null || at.Name == "")
{
at.Name = "__" + _variableIndex.ToString();
_variableIndex++;
}
}
}
bool changeS = (_state.S == _extraItem);
if (_h == null)
{
_heap = newItem;
_extraItem = new HeapNode();
newItem.Next = _extraItem;
_extraItem.Previous = newItem;
_h = newItem;
return;
}
_extraItem = newItem;
_extraItem.Previous = _h;
_h.Next = _extraItem;
_h = _h.Next;
if (changeS)
{
_state.S = _h;
}
HeapNode e = new HeapNode();
_extraItem.Next = e;
e.Previous = _extraItem;
_extraItem = _extraItem.Next;
}
//public void Push(HeapNode newItem)
//{
// if (_h == null)
// {
// _heap = newItem;
// _h = newItem;
// return;
// }
// _h.Next = newItem;
// _previousItem = _h;
// _h = _h.Next;
// _h.Previous = _previousItem;
//}
public object Pop()
{
// if heap is empty, return null
if (_h == null)
{
return null;
}
// top of the heap
HeapNode topOfHeap = _h;
// if the heap doesn't have one item only, go backwards
if (_h.Previous != null)
{
_h = _h.Previous;
_h.Next = _extraItem;
_extraItem.Previous = _h;
}
else
{
_h = null;
}
return topOfHeap;
}
public object Top()
{
return _h;
}
public override void Initialize(AbstractMachineState state)
{
_state = state;
}
public override bool Stop()
{
return true;
}
public override string ToString()
{
string str = "";
for (HeapNode h = _heap; h != null; h = h.Next)
{
str += " " + h.ToString() + " ";
}
return str;
}
}
}