1 /* =============================================================================
5 * =============================================================================
7 * Copyright (C) Stanford University, 2006. All Rights Reserved.
12 * University of California, Irvine
14 * =============================================================================
16 * Unless otherwise noted, the following license applies to STAMP files:
18 * Copyright (c) 2007, Stanford University
19 * All rights reserved.
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions are
25 * * Redistributions of source code must retain the above copyright
26 * notice, this list of conditions and the following disclaimer.
28 * * Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in
30 * the documentation and/or other materials provided with the
33 * * Neither the name of Stanford University nor the names of its
34 * contributors may be used to endorse or promote products derived
35 * from this software without specific prior written permission.
37 * THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY
38 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE
41 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
43 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
45 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
47 * THE POSSIBILITY OF SUCH DAMAGE.
49 * =============================================================================
52 #define QUEUE_GROWTH_FACTOR 2
54 public class Queue_t {
55 int pop; /* points before element to pop */
60 /* =============================================================================
62 * =============================================================================
64 public Queue_t(int initCapacity) {
65 int capacity = ((initCapacity < 2) ? 2 : initCapacity);
66 elements = new Object[capacity];
69 this.capacity = capacity;
75 /* =============================================================================
77 * =============================================================================
79 public boolean queue_isEmpty () {
80 //int pop = queuePtr.pop;
81 //int push = queuePtr.push;
82 //int capacity = queuePtr.capacity;
84 return (pop + 1) % capacity == push;
88 /* =============================================================================
90 * =============================================================================
100 /* =============================================================================
102 * =============================================================================
106 public void queue_shuffle(Random randomPtr) {
109 numElement = push - (pop + 1);
111 numElement = capacity - (pop - push + 1);
115 for (int i = 0; i < numElement; i++) {
116 int r1 = (int) randomPtr.random_generate() % numElement;
117 int r2 = (int) randomPtr.random_generate() % numElement;
118 int i1 = (base + r1) % capacity;
119 int i2 = (base + r2) % capacity;
120 Object tmp = elements[i1];
121 elements[i1] = elements[i2];
128 /* =============================================================================
130 * =============================================================================
132 public boolean queue_push (Object dataPtr) {
135 System.out.println("push == pop in Queue.java");
141 int newPush = (push + 1) % capacity;
142 if (newPush == pop) {
144 int newCapacity = capacity * QUEUE_GROWTH_FACTOR;
145 Object[] newElements = new Object[newCapacity];
146 if (newElements == null) {
151 Object[] tmpelements = elements;
154 for (src = (pop + 1); src < push; src++, dst++) {
155 newElements[dst] = elements[src];
159 for (src = (pop + 1); src < capacity; src++, dst++) {
160 newElements[dst] = elements[src];
162 for (src = 0; src < push; src++, dst++) {
163 newElements[dst] = elements[src];
168 elements = newElements;
169 pop = newCapacity - 1;
170 capacity = newCapacity;
172 newPush = push + 1; /* no need modulo */
175 elements[push] = dataPtr;
182 /* =============================================================================
184 * =============================================================================
187 Pqueue_push (Queue_t queuePtr, Object dataPtr)
189 int pop = queuePtr.pop;
190 int push = queuePtr.push;
191 int capacity = queuePtr.capacity;
194 System.out.println("push == pop in Queue.java");
199 int newPush = (push + 1) % capacity;
200 if (newPush == pop) {
202 int newCapacity = capacity * QUEUE_GROWTH_FACTOR;
203 Object[] newElements = new Object[newCapacity];
204 if (newElements == null) {
209 Object[] elements = queuePtr.elements;
212 for (src = (pop + 1); src < push; src++, dst++) {
213 newElements[dst] = elements[src];
217 for (src = (pop + 1); src < capacity; src++, dst++) {
218 newElements[dst] = elements[src];
220 for (src = 0; src < push; src++, dst++) {
221 newElements[dst] = elements[src];
226 queuePtr.elements = newElements;
227 queuePtr.pop = newCapacity - 1;
228 queuePtr.capacity = newCapacity;
230 newPush = push + 1; /* no need modulo */
234 queuePtr.elements[push] = dataPtr;
235 queuePtr.push = newPush;
240 /* =============================================================================
242 * =============================================================================
244 public Object queue_pop () {
245 int newPop = (pop + 1) % capacity;
246 if (newPop == push) {
250 //Object dataPtr = queuePtr.elements[newPop];
251 //queuePtr.pop = newPop;
252 Object dataPtr = elements[newPop];
260 /* =============================================================================
264 * =============================================================================