; b# R- a4 n3 h( i & @! B Q5 w/ r% q. q) r: A二、 用数组实现栈1、栈的接口定义 / d; M2 ~- ?0 t! h% u2 r/** . U+ N$ V' Q" U7 } * 定义栈的接口7 e* l1 [9 i5 ^- Y
*- D; a% g7 U/ c+ u
* @Author zhuhuix. a& e2 \$ w/ Y; I$ l1 }0 h
* @date 2020-05-01" y* [7 V$ g y; d$ k0 {# e, x* B d
*/ - e8 j- i; u; L% I; lpublic interface Stack { ^) ^( w' `* z0 _" r7 Y /** 2 W9 Y H4 e, j( c8 }. `8 v6 n * 入栈 , ]+ D/ S+ J: U' `" U( r * @param object 入栈元素 : j1 h( s7 k/ ] _0 v, I! i: Z */ ' E/ w! E/ h6 o( E+ h& a void push(Object object); 8 Y; ~) d: r2 n2 s1 u% \6 v* j8 j9 L! J$ ]
/**# Q0 p, L, K9 B( s1 P5 q
* 出栈 / X9 @. J/ q. n# y" \" D/ @& e! ~7 i * @return 出栈元素 , N t/ l$ ~* a4 X1 [$ L: n */ 5 ]4 h8 _! F1 I" H Object pop();) k) e) g! {: R( w
; V) l" r/ K, f8 r
/**- v& f, Y3 c) f! E8 v
* 获取元素个数$ Q1 L% E: l& K. t3 M8 z
* @return 元素个数0 @/ h/ v# Z# e3 ]
*/ $ q' v. G( y4 t4 x int getElementCount();0 j) T' h% Q P* C$ ~
6 G7 J3 A4 r6 j4 R /** ; v- S3 z4 y, w * 遍历栈的元素, v7 W* g+ ^) R2 p5 V! l5 U; A3 R' L
*/ 2 W& ]2 g% | D) u void traverse(); . W: m/ H. K. ?# p& U6 X5 |5 a q, m& J0 S E; x Y+ A S" S$ `} " |' L" K1 C- e1 B# D* R2、栈的接口实现, }% S1 C& T( ^+ p
/** 0 c9 P% X$ y# u, F' D6 {" _# q7 K * 栈的接口实现 @9 Y( ~$ ?+ p8 o. ]4 f
*9 v% u6 [5 ~" A. X9 _/ Y3 m
* @author zhuhuix * ~( H! ]. q/ q% r. H, s7 S/ P * @date 2020-05-017 t+ ~- i6 N0 G T1 a+ M$ V9 Z
*/( F9 i( n+ v5 w g0 q- I3 M; ~
public class StackImpl implements Stack {( J0 k% m5 I; Q' m( j( k
" a" L) [% D1 n& o. x& C3 {; }
protected Object[] element; & `3 l5 z" ^, d9 X0 A: n) V0 r' ]: m y# b1 y9 \ q% f, G* ~" D
protected int elementCount; ! Y2 A/ Z Z4 t) p3 r$ a, e% { K9 Q' s ^8 c2 ?6 e
private int defaultSize = 16; $ {+ F5 Z0 F w * c- T! K7 J, u0 U5 g5 [& K private int maxSize; 2 b6 \2 x& Y) G1 m % S4 f+ E% L Y9 `# @8 s+ t StackImpl() { 7 u! u, p# U# k; |% A4 ? element = new Object[defaultSize]; 6 y: w% D" w0 t: W5 y7 }9 V+ v maxSize = defaultSize;' t4 M4 M3 c$ b$ x
} 3 J d4 X W) l2 T9 w: n) r( y" w2 U* O9 w6 [( K
StackImpl(int size) {; v- W% o" Z- P/ i6 d
element = new Object[size];. ^6 @/ `5 N8 i$ ?: D8 C
maxSize = size;$ t6 |5 Z. q& w
}/ |, I. n6 o, J3 P# B; F8 t
: a' Y& Q$ `% G3 W' K @Override! c+ j+ `" q+ J4 {" b- |* ]$ Y5 S7 ^
public void push(Object object) { * R/ D" B& e( G3 G //如果元素个数已经达到数组的最大个数,则进行扩容4 f5 A: b5 t7 ~: V ~
if (elementCount == maxSize) { ' y0 @( X- X5 e7 I. a! a9 ]+ F: E element = Arrays.copyOf(element, elementCount + defaultSize);- O$ `# E% i: b% K
} 3 u" I; t3 `* b8 ?0 v! H element[elementCount++] = object;$ z: Q @8 x, ~& S/ ^
' @ ~0 R, i/ d& E% |0 J6 s
} 6 U" }( C" b& C3 h* u* q/ L // 本代码未实现数组的自动缩小,具体方法可参考JDK M/ M+ {1 p9 I4 f
@Override # h. f1 r8 k& { I/ \8 s" j- E public Object pop() { 4 B6 m$ O- K: v3 @ if (elementCount == 0) {3 t3 W, |* W# x
throw new ArrayIndexOutOfBoundsException("栈中无元素"); . }! K" N# B% `" _& A2 C }. h6 ~2 E9 h6 A: E5 H
Object object = element[--elementCount]; ; Q9 {6 s4 l) t& N3 W: ^& q element[elementCount] = null; - q3 _5 t; T" H* R return object; # I8 N1 g0 b N }# G2 y' X F; C5 v$ t& j
7 R: I0 x8 `! }* Q! ?* \ @Override5 u: D. P: k0 @2 i# H0 l' M! V
public int getElementCount() {! u" C" {/ n) n0 F M( x
return elementCount; ( t) ]& V8 s4 L6 R3 U# r }+ o6 y m6 d7 q& h6 C M4 V0 g
0 ~1 }- }7 ]4 _ @Override' g/ ]7 a2 O7 I8 y/ w/ C
public void traverse() { $ G& R7 B/ K- n \: f for (int i = 0; i < elementCount; i++) { ) v; _; y. j; k5 d2 i6 f System.out.print(element + ","); * t# @4 T% L3 a; q. o8 M& p } 1 i; Q8 e( V5 N- j G& V) [ System.out.println();( u/ n9 K, q& v( z3 z
} + D2 O3 c( G+ ?, l; ~1 t} $ A7 E* } H4 N v3、栈的测试1 J- t8 k4 q" N) n; y( e
public class StackTest {! V7 c& t) p9 y# p% S( u! F, R
public static void main(String[] args) { 7 {: j3 v( d1 M5 a, ?# M3 ]9 [ Stack stack = new StackImpl(); ) ^" M1 o4 w `# l2 `7 ` 4 ^( K) {! N/ F0 @( e //第一次入栈:压入1-15 1 s( @3 j6 y a# b/ z0 Y for (int i = 0; i < 16; i++) { " x/ r$ P4 s: Z" t- B8 A P stack.push(i); 4 t9 f6 ^& \6 u# a k* f! E; [ } $ m1 `. K& F! H System.out.println("第一次入栈后元素个数为:" + stack.getElementCount()); + i, ]2 `9 H( ~ stack.traverse();. O( E/ |0 L6 M6 r! l( h; O
, X- d5 B" v; ` //第二次入栈:压入16-310 ?' B% V; ?) `" ~
for (int i = 16; i < 32; i++) {$ a* X- W- T5 H8 R0 M* k
stack.push(i); 2 B) {5 X9 ], H } V7 R) o8 U* m) o2 ~
System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount());% R- J8 n# J# \! L
stack.traverse();( w0 \' |4 z! H( `
4 q1 u4 n- a* u //第一次出栈:取出31-16 & r! { K. C+ T; O% L for (int i = 0; i < 16; i++) {6 {5 l/ n% F& |
stack.pop(); 8 z2 E$ Q3 w$ S! }- b }" Z1 M ~2 j5 r! w! j$ g
System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount());9 D2 L/ c* Z/ ]) e
stack.traverse();9 h' u: s; l& B( ]$ b: a
+ ?- ^ x. _% b3 K5 I
//第二次出栈:取出15-0 5 w; I3 \, P2 z; o4 d for (int i = 0; i < 16; i++) { + |6 f3 g0 O4 H K3 S stack.pop(); 4 Y5 u1 ^" s( i- M6 j& D }- A6 Y, Z$ ^7 y7 `" y6 c
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount());7 U. d4 ^7 r* T- p
stack.traverse();, \3 f! [5 U+ F9 J" b, R
+ ]( _ @4 A; H. T //栈中无元素,出栈报错2 J9 o, x0 h1 @2 s2 W: F# q( O9 L
stack.pop();6 K) f+ m! T7 [$ z
5 i. v' Q" C6 m# x+ [, f" x
}+ I! d+ b; N4 C. f, ]6 a4 ?6 L2 g
} 6 q G0 k* T4 d4 a- B' N/ Z