: W- N9 S4 F z0 V. r: ?
" M+ \2 |* Q7 }4 S; ], y5 \
4 h4 e" \$ f- [ j3 l 二、 用数组实现栈1、栈的接口定义+ u1 K( u# k7 f# O, Y/ l" m! K
/**' ^5 b" {9 { H2 p( L% n4 ^ L
* 定义栈的接口$ _9 f7 l' O0 l' }3 Y" y. g5 `( v; W
*5 F8 X) x' ~ o9 c: @+ L; R' j
* @Author zhuhuix3 w4 Z* b7 Q3 ?* J7 V! k* O; R8 A
* @date 2020-05-019 {8 v" A( W$ ^5 M; D8 ^
*/ , ~/ }2 M! f* d+ W wpublic interface Stack { " f( q% L' p F; u /** 3 i& x+ q- z& u1 r& P- I, v * 入栈 . S# G% t/ ^( ]3 O; P2 {# {# p * @param object 入栈元素; o' ~; I5 Z7 c* g
*/! S3 w3 o! _8 `- o
void push(Object object);/ X; }6 o! u2 h
; S5 x, r8 y0 Z/ o: }0 S /** 8 ]/ E8 O( E7 S+ B6 N, z * 出栈; a& N# b/ p0 R/ h8 }1 a9 U- I
* @return 出栈元素4 Q7 k, ]5 S* r/ l# q) Z' S
*/$ @) U- S* T$ |
Object pop();' Y& z/ s3 U5 s4 [1 y
% o: H8 X6 K& @+ x /** 7 b7 T2 g( S5 ^ J/ i, k * 获取元素个数( v) p/ ^0 N/ X! p( P
* @return 元素个数 ( D% C4 s$ r _3 L0 q& ?, G* | */ 1 O H, f" }1 i G% n/ l int getElementCount();; m- L+ P4 v1 K) y/ W( p
3 w1 s1 w" O* C8 ]- {3 y" F /** 3 c. N; T: L9 ^0 i * 遍历栈的元素 ; u k# C1 l& d5 } */ * W4 Y. V2 Z% T- P void traverse(); 3 E; J: K& {5 A/ L& l1 d- [% |% ?% W H$ \
} 1 k3 t, a0 P* ]0 o" q i2、栈的接口实现 & k6 D( f( u' y/**9 o7 `% p, ]* b! j
* 栈的接口实现7 e4 }, }: j& ]8 Q9 ?
* % T9 P0 g0 b; n" y; I * @author zhuhuix 9 }; n o5 S* i! r6 j- z. o( v0 p * @date 2020-05-01 6 @( E: W' K) V' b: C */ ! z% B3 V: R; @6 hpublic class StackImpl implements Stack { * V8 a' B3 F% c( K; s, N - h5 h/ G# F% a" c8 S. ~* p- U
protected Object[] element; 8 q* n! Q! w1 h7 H5 } ]8 z5 T : {- K/ j$ F/ X4 w; H2 f# a protected int elementCount;) m$ U' r8 I2 h P; T8 H* t
& } c o: T2 }+ m private int defaultSize = 16; & i. h& H' g- g5 Q% V + {% f" P& O, e Y6 x2 d2 H private int maxSize; ^( m2 Q( x0 }8 C3 s- g ; ]3 k3 X9 |# z. v StackImpl() { . K4 V! o; v \; W element = new Object[defaultSize];8 }# _& B! _/ J7 E$ x6 V" j
maxSize = defaultSize;; ?& t: j" C9 ~
}, z4 z. R2 x" p& L; D
2 B; f. h/ ^) Z1 d t2 h) k/ |4 k6 P3 M StackImpl(int size) { ( l( n/ K1 v1 O) X+ Q5 F! a5 [ element = new Object[size];# b6 v& ~9 D0 z9 k
maxSize = size; ' g/ n; ?6 z! J, s: Y }2 N' D5 J ?( `
+ Q( {' ^: R7 a' g
@Override ; D3 ]( L9 J+ R W+ j0 | public void push(Object object) { + H3 O. E1 a1 t \ ~+ L //如果元素个数已经达到数组的最大个数,则进行扩容" b2 Z! S7 v" t' C' q
if (elementCount == maxSize) { / d m1 A, y& y. Y element = Arrays.copyOf(element, elementCount + defaultSize); i# J. K- ?+ u! ], g } ! o! d: D2 M6 |/ ^" U$ B0 W$ ~) N element[elementCount++] = object; : s+ p3 _* m: I2 {% a$ l : o2 j3 M' I ? } . T [6 q% V/ w2 u0 ~% F8 L* g // 本代码未实现数组的自动缩小,具体方法可参考JDK 7 V+ f# ^, q- U0 v @Override 9 S N* H( W# _( d3 G \4 C5 S# M public Object pop() {; ]$ f# [8 }* ~1 F( o* n5 P
if (elementCount == 0) { % A2 s; w7 s; N throw new ArrayIndexOutOfBoundsException("栈中无元素"); / w' E1 i5 i9 `8 k/ n* w } ; y, H! B4 ]4 a- l4 Y Object object = element[--elementCount]; 7 B- u) a9 n. C+ ~. B( m5 V element[elementCount] = null;8 w, T" I/ H1 _) d6 c5 s$ M$ `
return object;8 K8 E* D j \ E J5 f* ^7 _
}4 S' h. m9 Z( q5 Y. ^8 Z# U1 r5 Z4 K
2 a; N/ Y1 d8 E" @
@Override9 i( y6 \$ J, C8 s; [; ?
public int getElementCount() {; p' s, H1 e$ C" Y
return elementCount; 7 F, J; k: c: D2 J1 R. C } * `) D7 Q2 w/ @7 }/ e; G ( y9 P- e* x' d u3 R @Override # h1 b1 F# W) l4 N6 M2 |- E public void traverse() { * a3 r0 z# ?2 S2 F0 U+ m+ H/ Q for (int i = 0; i < elementCount; i++) {$ ]0 B" }$ h. j$ \& A* E+ X6 r
System.out.print(element + ",");, K9 u- \0 X$ }/ \. ~
}6 n5 [/ X3 G: ]3 {" ^% C# h& z
System.out.println();6 N4 Y# Z2 n2 Y0 U: V
}& Q5 `% k8 u( h8 {4 s4 d/ k) j0 k
} ( t* ?2 X# v k% F3、栈的测试 * C$ q! _& W; K- ~$ p8 O' qpublic class StackTest {; D. C# s. C) R! \( ?
public static void main(String[] args) {& @5 d# |& g( D6 y. `5 ]0 Y
Stack stack = new StackImpl(); : Q; P% H4 T5 I/ N0 [+ h9 L5 c* O+ W1 L- Q
//第一次入栈:压入1-153 A' b% }* h% @7 j/ z/ S& D
for (int i = 0; i < 16; i++) {( h+ `. S# t. M ~
stack.push(i); 4 g9 k) N: {5 s. K/ C" r, U! {6 m6 l* C }' \. _) F, T+ A
System.out.println("第一次入栈后元素个数为:" + stack.getElementCount()); $ _! J# c( ~6 S* Q# I stack.traverse(); . A/ x- P" u1 p# }0 p+ [5 L; L4 D- n
//第二次入栈:压入16-31 + G9 S% e& w( _8 V for (int i = 16; i < 32; i++) {2 z$ v! r$ l) }0 t( n+ p
stack.push(i); . X( [2 x1 A0 D7 [6 j s }" l" d0 I& I. n, v6 Q- Z
System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount()); + ^( E: }$ v/ P8 h# T stack.traverse();/ C% n. k8 r2 h& s: B
' Y, i" t$ W1 ~1 S+ |/ Y //第一次出栈:取出31-16 ! k5 C% f8 B( c" y4 Z0 @ for (int i = 0; i < 16; i++) { 5 o: t& u, o$ T( {4 ]+ [" @" B stack.pop(); / d$ X' _9 K+ L1 m2 E } 4 r. L3 Q+ R8 v* O% y System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); 7 p: F% u: N" \( u stack.traverse();% Q- ^9 n* _; r6 s5 T& {
2 U C/ i( Q. a F; i
//第二次出栈:取出15-0 & x& |- B: w G' y1 [ for (int i = 0; i < 16; i++) { 7 _+ D# r) Z$ P) }( D5 t stack.pop();6 e, A" b& \0 ?$ N! N4 S
}8 ~5 s7 t' x" ~# S0 f$ ^- x% j
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount()); 3 a6 g# ~" y& \" k stack.traverse(); 8 @$ Z- C( J0 `) _: A K8 } . q( s; s* B! ^: _+ R7 n0 O8 K/ E# f //栈中无元素,出栈报错" N$ x5 f# Z2 O: M7 _
stack.pop();' B5 u$ @4 f' q+ J' i5 \
5 M2 Y0 M- |0 o& N- E2 w$ A
}: w# [. l2 o" _, y' E
} ( _; B1 Q% a* G, n( V