1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.collections.primitives;
18
19 import java.util.EmptyStackException;
20
21 import org.apache.commons.collections.primitives.ArrayIntList;
22
23 /**
24 * A primitive int based Stack.
25 *
26 * @author Apache Directory Project
27 * @since Commons Primitives 1.1
28 * @version $Revision: 480460 $ $Date: 2006-11-29 03:14:21 -0500 (Wed, 29 Nov 2006) $
29 */
30 public class IntStack
31 {
32 /** the underlying dynamic primitive backing store */
33 private ArrayIntList list = new ArrayIntList() ;
34
35
36 public IntStack()
37 {
38 }
39
40
41 public IntStack( int[] numbas )
42 {
43 for ( int ii = 0; ii < numbas.length; ii++ )
44 {
45 list.add( numbas[ii] ) ;
46 }
47 }
48
49
50 /**
51 * Tests if this stack is empty.
52 *
53 * @return true if and only if this stack contains no ints; false otherwise
54 */
55 public boolean empty()
56 {
57 return list.isEmpty() ;
58 }
59
60
61 /**
62 * Looks at the int at the top of this stack without removing it from
63 * the stack.
64 *
65 * @return int at the top of this stack (last int in ArrayIntList)
66 * @throws EmptyStackException if this stack is empty
67 */
68 public int peek()
69 {
70 if ( list.isEmpty() )
71 {
72 throw new EmptyStackException() ;
73 }
74
75 return list.get( list.size() - 1 ) ;
76 }
77
78
79 /**
80 * Return the n'th int down the stack, where 0 is the top element and
81 * [size()-1] is the bottom element.
82 *
83 * @param n the element index
84 * @return the element at the index
85 * @throws EmptyStackException if the stack is empty
86 * @throws IndexOutOfBoundsException if the index is out of bounds
87 */
88 public int peek( int n )
89 {
90 if ( list.isEmpty() )
91 {
92 throw new EmptyStackException() ;
93 }
94
95 return list.get( list.size() - n - 1 ) ;
96 }
97
98
99 /**
100 * Removes the int at the top of this stack and returns that object as the
101 * value of this function.
102 *
103 * @return int at the top of this stack (last int in ArrayIntList)
104 * @throws EmptyStackException if this stack is empty
105 */
106 public int pop()
107 {
108 if ( list.isEmpty() )
109 {
110 throw new EmptyStackException() ;
111 }
112
113 return list.removeElementAt( list.size() - 1 ) ;
114 }
115
116
117 /**
118 * Pushes an int item onto the top of this stack.
119 *
120 * @param item the int item to push onto this stack
121 * @return the item argument for call chaining
122 */
123 public int push( int item )
124 {
125 list.add( item ) ;
126 return item ;
127 }
128
129
130 /**
131 * Returns the 1-based position where an int is on this stack. If the int
132 * occurs as an item in this stack, this method returns the distance from
133 * the top of the stack of the occurrence nearest the top of the stack; the
134 * topmost item on the stack is considered to be at distance 1.
135 *
136 * @param item the int to search for from the top down
137 * @return the 1-based position from the top of the stack where the int is
138 * located; the return value -1 indicates that the int is not on the stack
139 */
140 public int search( int item )
141 {
142 for ( int ii = list.size() - 1; ii >= 0; ii-- )
143 {
144 if ( list.get( ii ) == item )
145 {
146 return list.size() - ii ;
147 }
148 }
149
150
151 return -1 ;
152 }
153
154
155 /**
156 * Gets items from the stack where the index is zero based and the top of
157 * the stack is at an index of size()-1 with the bottom of the stack at an
158 * index of 0.
159 *
160 * @param index the index into the stack treated as a list
161 * @return the int value at the index
162 */
163 public int get( int index )
164 {
165 return list.get( index ) ;
166 }
167
168
169 /**
170 * Gets the size of this stack.
171 *
172 * @return the size of this stack
173 */
174 public int size()
175 {
176 return list.size() ;
177 }
178
179
180 /**
181 * Empties the contents of the stack.
182 */
183 public void clear()
184 {
185 list.clear() ;
186 }
187 }