+ i: i& s3 ]( ], A" I' j0 p- a: h 9 z9 K! }% |! }+ h. X& _: l+ M- Y6 y. w. G# ^7 C2 u0 j 二、 用数组实现栈1、栈的接口定义) ` k3 q& H& r( Z, e) n
/** 0 g6 c8 j) l& E/ U' m: F" E! f * 定义栈的接口: f+ E, k0 b; {) N6 H4 ]
* 2 [9 ]5 Y0 Y+ i, e * @Author zhuhuix $ N8 C9 v" j/ R, r$ v * @date 2020-05-01/ _, j" |+ f7 Y. V- v8 F
*/ # S3 P' S3 Z. H' }$ t3 Rpublic interface Stack {, h; j* @# D/ o5 M4 f8 g6 A# q
/** 6 @, I3 }8 y% ?6 _$ I * 入栈: i. u- P! I- @6 [
* @param object 入栈元素* P b3 {0 a# v
*/ ' l( r8 x$ R% W& V4 s/ i+ F8 F6 I void push(Object object); ) N% r! K2 J+ c3 z , z- ?8 W0 F5 g& ]* t; {& _, T" Q. e /**! S1 t2 s+ x% |0 T
* 出栈, f$ z# l% d T' X% \8 J* e
* @return 出栈元素6 `5 k$ e' g6 ]7 R( U
*/3 h8 ` A7 M m4 a2 r# {, Y
Object pop();9 u' J% h3 _7 `; T ]! o
0 J, Q4 S6 a8 |* a; l$ O% Y+ r( H1 m
/**) R8 v. K4 B! J0 G5 Z
* 获取元素个数$ j- p- k1 d- b! A
* @return 元素个数 l' P0 ?) n# w, b */1 k' o: D3 F# f8 y
int getElementCount();9 q6 b8 l# D4 @, J
) I4 h5 h9 s' J. e- d
/**3 G. P" A" c! I+ B, f6 `3 ?1 q
* 遍历栈的元素 % {- J4 |9 k/ u8 c9 a* O- l */7 z8 P7 n" X3 N' x% I4 A9 P8 ~7 ?2 p
void traverse(); ; ~5 q' c6 N4 D. v) w9 V' c6 t , q, @* x7 b3 P* V4 W}. }4 Y o- |) R, o 2、栈的接口实现 6 O- p) L0 t; q4 y5 U/**: T& o2 ~( [1 L" v2 I; Z
* 栈的接口实现2 o L2 O$ a2 a' n& f2 h
*0 d, ^1 N/ l" s
* @author zhuhuix , j0 p6 {. _0 N * @date 2020-05-01 ! P- I4 c" n! z6 R9 X, k' q */1 Q0 c# l: {' `+ T
public class StackImpl implements Stack {1 Y# {: B* k- z; R. p
9 M/ o' G3 U/ ]- \7 }7 ^ protected Object[] element; 1 D$ d" R) t) P8 h9 Z/ n$ H# c1 o$ B9 M
protected int elementCount; 1 V8 S, j; y$ D( Z+ W% ]" H, e' g* C
private int defaultSize = 16; 2 U3 N% N6 \& Y3 _ ( [) Q2 I" P I/ } private int maxSize;& P! |: T i& b9 {& |4 c
5 u) W0 t. a1 F9 \0 {) R. w
StackImpl() {4 u' g; P" h. y
element = new Object[defaultSize];' }3 I4 `' s/ ^
maxSize = defaultSize;+ c9 N+ i% [. Y
} 7 c6 f3 K: t$ b- d1 S! T U1 Q9 r( J& w! e. `8 `: r
StackImpl(int size) { * E8 q X/ c$ K* ~ element = new Object[size]; 5 k- u3 m# {1 @( @8 S' @ maxSize = size;1 y' e9 y8 w& H
}6 l$ X9 o0 d7 y% o
, \4 l( x& D1 q! }
@Override9 R/ n4 i$ N& K8 y: [
public void push(Object object) {5 |, a$ |( R; t; J6 U1 x; C7 t
//如果元素个数已经达到数组的最大个数,则进行扩容# G& x6 j- B# x
if (elementCount == maxSize) { + a2 U, @6 R) {9 K) I element = Arrays.copyOf(element, elementCount + defaultSize);7 x( B' ~( I% M1 Y5 R
}# J, r4 G1 P; s5 `& r
element[elementCount++] = object;: @( j$ B0 @6 |
7 V5 p' N/ g9 G' P6 I |' b
}0 D! c, B4 i) ], `8 P/ j3 ?
// 本代码未实现数组的自动缩小,具体方法可参考JDK 3 i5 |# Q8 A# e: E @Override7 ]1 R7 y+ T6 p4 o
public Object pop() { ( O* ~8 V: p/ f3 R' i2 P1 q if (elementCount == 0) { 3 t- C. O i5 B9 o. v throw new ArrayIndexOutOfBoundsException("栈中无元素"); " D5 h6 ]( T7 m/ { }) L' |, y$ ?% |; G6 y/ ^
Object object = element[--elementCount];- l6 a+ a8 ^! F& O4 [& {2 m$ o( f/ D
element[elementCount] = null; ; `9 r% I$ S4 m z8 I5 j. a+ ? return object; 4 ?) r/ g' ?1 `3 K1 h7 |0 s" y }- u" v; P. A1 O& d( {) S! z- y
; l( C2 T! d; j2 i; |5 R! K
@Override* A. M$ D3 D% W
public int getElementCount() { g6 u, s. n! ?* b A8 l6 u0 K
return elementCount;5 O3 h; d( _5 h7 K
}( C6 ^. n+ I5 g9 L
6 u1 B5 o8 E: t; [# }# m6 S @Override8 y! [6 Y4 p s
public void traverse() {# l+ R/ S" x3 r4 g, a" Y9 W
for (int i = 0; i < elementCount; i++) { 3 V! M+ F1 x% [6 p System.out.print(element + ","); * j9 f1 j' i T6 S2 P; } }, [) w, ^& v6 {3 j; d( k
System.out.println(); 2 Y) p2 U D) X' M% k } 0 ~7 x0 Y; ~ ^! P} " @ N! I/ U5 J. F8 W% a; y3、栈的测试 % I3 ^% |& |% Vpublic class StackTest {+ [6 L! j5 i9 Q& C- y$ d+ U
public static void main(String[] args) { 6 J* C1 K# K- ^% x' z7 T4 B2 N Stack stack = new StackImpl();4 ]+ }0 `0 c( P4 M8 {: y2 n
4 r) d9 L" {1 E3 Q! S; ?0 E //第一次入栈:压入1-15 ' v- v4 x. C! @- S( I5 ? for (int i = 0; i < 16; i++) { % t6 O" G4 b: ~. F7 c2 {* E) K stack.push(i); b) w( F( c) M" [ } , u; J0 D: o1 y" ? System.out.println("第一次入栈后元素个数为:" + stack.getElementCount());, A, y% F# j5 Z: s/ M1 B6 O* ]
stack.traverse(); : B9 z% E8 J" J' J. Z; S, _- l$ A. W( O+ V
//第二次入栈:压入16-31* k+ v( k ]* g v- b
for (int i = 16; i < 32; i++) {' C/ }# n' E! r9 [" x5 p! y
stack.push(i); 2 i9 h; i/ K: ~$ F8 D$ ] }7 S. e/ [$ G# \8 Y2 V
System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount()); - I$ _* E0 S9 R/ K% f6 v# u1 ? stack.traverse();3 h! R% w1 O( q4 {) z$ o8 ?
7 }# o4 d5 r; \/ S //第一次出栈:取出31-161 k' i9 m% `- ^8 L' M |3 C
for (int i = 0; i < 16; i++) { 5 S) D; ], }* h, f& j' m2 E stack.pop();' W) E, j+ m" r) [0 f! o
} $ ]0 W h% k) s( C' ?$ C. A System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); 2 {; P3 Q) A$ q1 C stack.traverse(); 6 ^: d7 B' Y# F; ]9 O% i; u 3 D. D0 _- p9 } //第二次出栈:取出15-0 & g+ l! w, _/ |$ L for (int i = 0; i < 16; i++) { $ K& X# O' \/ s$ N, Y1 o8 | stack.pop();- ~0 I+ y g+ S" k
}/ D$ x4 X+ |% i E
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount());4 y4 V6 f% ~, t
stack.traverse(); 6 s; D0 c; K% F ' R% @4 }. K# Q. s s' J //栈中无元素,出栈报错 9 w, \$ e/ O: A, m9 D& e. y8 t stack.pop(); - p! u/ _3 w6 U" @7 m( ?/ T1 f( G& n' G' D7 f, Z& z( m
}0 O! o' y9 y; d! |: |4 `7 W
}+ e. X$ ^/ I: u+ N6 [ Q/ J