001 package ps1;
002
003 import java.util.Stack;
004 import java.util.Iterator;
005
006 /**
007 * <b>RatPolyStack</B> is a mutable finite sequence of RatPoly objects.
008 * <p>
009 * Each RatPolyStack can be described by [p1, p2, ... ], where [] is an empty
010 * stack, [p1] is a one element stack containing the Poly 'p1', and so on.
011 * RatPolyStacks can also be described constructively, with the append
012 * operation, ':'. such that [p1]:S is the result of putting p1 at the front of
013 * the RatPolyStack S.
014 * <p>
015 * A finite sequence has an associated size, corresponding to the number of
016 * elements in the sequence. Thus the size of [] is 0, the size of [p1] is 1,
017 * the size of [p1, p1] is 2, and so on.
018 * <p>
019 */
020 public final class RatPolyStack implements Iterable<RatPoly> {
021
022 private final Stack<RatPoly> polys;
023
024 // Abstraction Function:
025 // Each element of a RatPolyStack, s, is mapped to the
026 // corrisponding element of polys.
027 //
028 // RepInvariant:
029 // polys != null &&
030 // forall i such that (0 <= i < polys.size(), polys.get(i) != null
031
032 /**
033 * @effects Constructs a new RatPolyStack, [].
034 */
035 public RatPolyStack() {
036 polys = new Stack<RatPoly>();
037 checkRep();
038 }
039
040 /**
041 * Returns the number of RayPolys in this RatPolyStack.
042 *
043 * @return the size of this sequence.
044 */
045 public int size() {
046 // TODO: Fill in this method, then remove the RuntimeException
047 throw new RuntimeException("RatPolyStack->size() unimplemented!\n");
048 }
049
050 /**
051 * Pushes a RatPoly onto the top of this.
052 *
053 * @requires p != null
054 * @modifies this
055 * @effects this_post = [p]:this
056 */
057 public void push(RatPoly p) {
058 // TODO: Fill in this method, then remove the RuntimeException
059 throw new RuntimeException("RatPolyStack->push() unimplemented!\n");
060 }
061
062 /**
063 * Removes and returns the top RatPoly.
064 *
065 * @requires this.size() > 0
066 * @modifies this
067 * @effects If this = [p]:S then this_post = S
068 * @return p where this = [p]:S
069 */
070 public RatPoly pop() {
071 // TODO: Fill in this method, then remove the RuntimeException
072 throw new RuntimeException("RatPolyStack->pop() unimplemented!\n");
073 }
074
075 /**
076 * Duplicates the top RatPoly on this.
077 *
078 * @requires this.size() > 0
079 * @modifies this
080 * @effects If this = [p]:S then this_post = [p, p]:S
081 */
082 public void dup() {
083 // TODO: Fill in this method, then remove the RuntimeException
084 throw new RuntimeException("RatPolyStack->dup() unimplemented!\n");
085 }
086
087 /**
088 * Swaps the top two elements of this.
089 *
090 * @requires this.size() >= 2
091 * @modifies this
092 * @effects If this = [p1, p2]:S then this_post = [p2, p1]:S
093 */
094 public void swap() {
095 // TODO: Fill in this method, then remove the RuntimeException
096 throw new RuntimeException("RatPolyStack->swap() unimplemented!\n");
097 }
098
099 /**
100 * Clears the stack.
101 *
102 * @modifies this
103 * @effects this_post = []
104 */
105 public void clear() {
106 // TODO: Fill in this method, then remove the RuntimeException
107 throw new RuntimeException("RatPolyStack->clear() unimplemented!\n");
108 }
109
110 /**
111 * Returns the RatPoly that is 'index' elements from the top of the stack.
112 *
113 * @requires index >= 0 && index < this.size()
114 * @return If this = S:[p]:T where S.size() = index, then returns p.
115 */
116 public RatPoly getNthFromTop(int index) {
117 // TODO: Fill in this method, then remove the RuntimeException
118 throw new RuntimeException(
119 "RatPolyStack->getNthFromTop() unimplemented!\n");
120 }
121
122 /**
123 * Pops two elements off of the stack, adds them, and places the result on
124 * top of the stack.
125 *
126 * @requires this.size() >= 2
127 * @modifies this
128 * @effects If this = [p1, p2]:S then this_post = [p3]:S where p3 = p1 + p2
129 */
130 public void add() {
131 // TODO: Fill in this method, then remove the RuntimeException
132 throw new RuntimeException("RatPolyStack->add() unimplemented!\n");
133 }
134
135 /**
136 * Subtracts the top poly from the next from top poly, pops both off the
137 * stack, and places the result on top of the stack.
138 *
139 * @requires this.size() >= 2
140 * @modifies this
141 * @effects If this = [p1, p2]:S then this_post = [p3]:S where p3 = p2 - p1
142 */
143 public void sub() {
144 // TODO: Fill in this method, then remove the RuntimeException
145 throw new RuntimeException("RatPolyStack->sub() unimplemented!\n");
146 }
147
148 /**
149 * Pops two elements off of the stack, multiplies them, and places the
150 * result on top of the stack.
151 *
152 * @requires this.size() >= 2
153 * @modifies this
154 * @effects If this = [p1, p2]:S then this_post = [p3]:S where p3 = p1 * p2
155 */
156 public void mul() {
157 // TODO: Fill in this method, then remove the RuntimeException
158 throw new RuntimeException("RatPolyStack->mul() unimplemented!\n");
159 }
160
161 /**
162 * Divides the next from top poly by the top poly, pops both off the stack,
163 * and places the result on top of the stack.
164 *
165 * @requires this.size() >= 2
166 * @modifies this
167 * @effects If this = [p1, p2]:S then this_post = [p3]:S where p3 = p2 / p1
168 */
169 public void div() {
170 // TODO: Fill in this method, then remove the RuntimeException
171 throw new RuntimeException("RatPolyStack->div() unimplemented!\n");
172 }
173
174 /**
175 * Pops the top element off of the stack, differentiates it, and places the
176 * result on top of the stack.
177 *
178 * @requires this.size() >= 1
179 * @modifies this
180 * @effects If this = [p1]:S then this_post = [p2]:S where p2 = derivative
181 * of p1
182 */
183 public void differentiate() {
184 // TODO: Fill in this method, then remove the RuntimeException
185 throw new RuntimeException(
186 "RatPolyStack->differentiate() unimplemented!\n");
187 }
188
189 /**
190 * Pops the top element off of the stack, integrates it, and places the
191 * result on top of the stack.
192 *
193 * @requires this.size() >= 1
194 * @modifies this
195 * @effects If this = [p1]:S then this_post = [p2]:S where p2 = indefinite
196 * integral of p1 with integration constant 0
197 */
198 public void integrate() {
199 // TODO: Fill in this method, then remove the RuntimeException
200 throw new RuntimeException("RatPolyStack->integrate() unimplemented!\n");
201 }
202
203 /**
204 * Returns an iterator of the elements contained in the stack.
205 *
206 * @return an iterator of the elements contained in the stack in order from
207 * the bottom of the stack to the top of the stack.
208 */
209 public Iterator<RatPoly> iterator() {
210 return polys.iterator();
211 }
212
213 /**
214 * Checks that the representation invariant holds (if any).
215 */
216 // Throws a RuntimeException if the rep invariant is violated.
217 private void checkRep() throws RuntimeException {
218 if (polys == null) {
219 throw new RuntimeException("polys should never be null.");
220 }
221 for (RatPoly p : polys) {
222 if (p == null) {
223 throw new RuntimeException(
224 "polys should never contain a null element.");
225 }
226 }
227 }
228 }