# r5 _- @0 v' X5 ~ I. a
. |/ Z" l# L; ^/ b# ~1 I5 i
4 {2 T$ e y1 [! p+ S9 T# q* e 二、 用数组实现栈1、栈的接口定义) l/ S) t& _/ ?/ K4 C$ q, @2 ^
/**& Y0 W# d! j* D$ E
* 定义栈的接口5 i- v- w& m/ u
* n/ A5 K4 V1 y: ^2 w$ @$ U
* @Author zhuhuix r% h" }3 }; z/ W8 z2 ]# f
* @date 2020-05-01 2 q6 I) a' D# U7 y8 o& q */ . Y- I. t, F9 O6 U5 T" z4 Hpublic interface Stack {' ?# U+ P0 i( \0 O0 g: J. G5 }$ a
/**/ h( u. I) z" g2 A9 [+ p
* 入栈 # T3 E" |4 W" S: k4 _ * @param object 入栈元素- l. H- h4 V- |- E n# |$ Z
*/ ! A0 d \1 y) u" D* U void push(Object object);; s/ Q5 }7 r6 R/ H9 c
6 ?$ T8 k% m( R+ N- y5 a
/**0 J+ n) x6 z( k* c- R; B4 n
* 出栈 5 d9 ?" A8 E; l$ x- ~8 B * @return 出栈元素5 W, A0 A! @0 {$ i8 C" i% y: _
*/' k+ u) e( G: U# i" I- J h
Object pop();+ {% v: ]' J& Z6 I
% [! e* N0 [, j! T6 ]: K /** 5 ~, W) q5 b' s) W8 ?7 ]# ] * 获取元素个数 & h* O( E# ]6 Z" A * @return 元素个数 + Y3 l- D9 U0 m */ 1 ^0 u2 }8 P+ K int getElementCount(); ' V4 v) r6 b9 Z/ j7 G- _5 H# r1 a- a8 O1 A' b6 a3 u
/** ) n+ a* r. ?, A5 g c* d2 Y& ? * 遍历栈的元素* x3 h7 f5 p8 r4 F( z- L: B
*/4 v8 }4 n& E7 z+ [% X
void traverse(); 5 Z8 J* h ^( @+ p6 P * g0 \. U3 e8 k: R4 Y}6 O: v' R9 M7 e0 R+ {# ?$ j I' x 2、栈的接口实现4 K% ]0 A( ?' N6 n- X/ x0 p
/**7 f9 ?5 `4 h( R3 U$ s9 B1 C# Q9 J
* 栈的接口实现& Q3 K& f2 y; m6 x5 w) r# A0 B. F5 a
* , Z- w r! c" e. O( j7 G* S * @author zhuhuix. O4 x0 ?5 J& G% w
* @date 2020-05-014 X2 X- q1 ?7 A& A+ M
*/ 9 q3 p0 f7 d% D& P7 H( K Spublic class StackImpl implements Stack {1 i0 T$ n! |. j8 s% y
4 N R% H$ l7 S% j7 o* E( ^* N
protected Object[] element;) A3 Y* D: }4 \% w3 r- Z
$ t, d/ x* _* v* @+ F! T. F protected int elementCount;! B& J2 w9 U1 D' A( }$ K. Z" i
7 n. u' l# N; e4 D
private int defaultSize = 16; ; A% D) z8 e' Z2 i2 |; @* \2 M9 D; U' b
private int maxSize;" i1 n. l, S! |/ W3 M0 E
' n3 ~( W9 K5 l: W StackImpl() { . b S) f, ^" G$ E element = new Object[defaultSize]; 3 N. ~( {9 `7 y: W9 G maxSize = defaultSize;5 ?& O+ \) N5 G, V b9 ]7 d y: `
}7 L5 M' o' `4 i' z: D! z0 T
{/ V2 n3 w& }1 y9 l" O
StackImpl(int size) {# B. @$ M* M! z) B! s
element = new Object[size]; $ o2 P. \: C$ R1 c5 S9 ?3 f" l& k maxSize = size; ; E) ^5 {6 Q8 x7 F7 P } ( }7 G! g, {$ R- @( I4 M, @1 i, z# m" P. X8 d+ h/ m; D
@Override- {: i9 M8 k" w# _7 w$ b* P! T! z
public void push(Object object) { : {, [! O. _9 R- d1 C( M* G: e; @2 _7 U0 X/ ] //如果元素个数已经达到数组的最大个数,则进行扩容! m: E# H ~2 ~ f5 [/ j+ o
if (elementCount == maxSize) {4 B1 g7 }7 o! ^& \, p) ~6 S
element = Arrays.copyOf(element, elementCount + defaultSize);, c7 A u( _7 @( `
} & v" G3 @' E( u element[elementCount++] = object; : n, |6 ^0 k1 R; _$ j6 y0 {1 b3 o: ?9 h; k8 `. B
}. [4 `' Y! J8 p
// 本代码未实现数组的自动缩小,具体方法可参考JDK ) S5 B. a% [( V7 o @Override$ A8 }8 k6 h# U( {" m5 {9 D
public Object pop() { ) ^8 W, V) ^7 y! J' o9 D! R if (elementCount == 0) { 4 \. i( s4 I# e# ] throw new ArrayIndexOutOfBoundsException("栈中无元素");$ K- ~) }) S" S/ K9 _( [7 J4 O1 b
} * c1 r! W0 Q- c$ J1 | Object object = element[--elementCount];1 ~2 {+ ?6 `, O- ~3 F
element[elementCount] = null;1 V3 Q$ U: f3 T u- a/ ?; ~
return object;2 W V7 V+ ]) C' l- g p& J* c
} 9 w8 D6 X* A8 `% R! p) r/ q : q3 t( C8 D$ G6 y% T0 ? @Override - N- z: o; e B d G public int getElementCount() {. y1 @/ a v+ I
return elementCount;/ Y9 R b& g. ]" D( t
}- R3 l1 b/ p+ j; `0 g) |4 w
) f. s9 y1 U+ P. n$ }
@Override I2 A, A4 o; Q) J
public void traverse() { T4 a6 @6 u3 E5 S6 c9 C$ T- A% m
for (int i = 0; i < elementCount; i++) {" l3 f, Z" ~% o( P+ a# c, T/ L
System.out.print(element + ",");7 ^) |2 E" _& ]* _6 C. S
}6 y& }5 a5 ^8 L8 f( {% h
System.out.println();0 R7 z: s" c& ^4 Z* P$ e6 L$ D% u
}7 ?8 c, [$ ~, `3 I7 V6 I
}1 _* P6 S/ _$ J1 Q" x( P0 Q; f 3、栈的测试 ! C5 D$ X" u. ?public class StackTest {! J' T( e5 A6 Z5 p) }
public static void main(String[] args) { # X* j7 k' k% y% D# ?- I( y: ^# E5 g Stack stack = new StackImpl(); 7 M, D$ k4 v; e" t ( w" V% G- u! E+ ] //第一次入栈:压入1-15 / R2 u3 m" w- q t for (int i = 0; i < 16; i++) {# u$ n# P2 W1 f3 S
stack.push(i);. f0 Q& C3 ]- k2 P
}( Q/ q3 d, C( i! M: L$ V
System.out.println("第一次入栈后元素个数为:" + stack.getElementCount()); 8 ]4 Z" V" g& t! Y/ N) k0 [ stack.traverse();& p* D% z3 I! _0 V# j3 s: ?" o0 V
) u, s* K9 v1 y6 n( }: t5 b
//第二次入栈:压入16-31 / A. L$ a, L3 B C for (int i = 16; i < 32; i++) {" m, V' g1 Q- ?; p
stack.push(i);/ j) c; k5 H1 s, _% ^* F! u5 e
}' a0 e. v+ e9 V. x. ?
System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount());% q1 b# q! O* L6 p9 [/ @$ D! `' a
stack.traverse();. o/ i K. ?( I4 i9 P" N
% H' y* A4 q; V) i: R //第一次出栈:取出31-16 F2 c) |- n7 B1 O. Y; s& \) m for (int i = 0; i < 16; i++) { / o6 `# I# W9 `4 f stack.pop();- s! U9 M6 A$ ~# P+ c0 \- Z
} ! e: j$ I, e9 t" D% F+ \ System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); 4 b" \" S3 e" Q& Q) u: t; a$ _ stack.traverse();9 x0 G5 N- m- V. n( c
+ U8 x: w- x2 J6 V
//第二次出栈:取出15-0 - A" I9 Z: d) U; _2 A for (int i = 0; i < 16; i++) { " y; l: O: |/ i# Z8 B0 I7 g stack.pop(); . i, C( v# i9 R" A" F; O }- o' l' Z P+ @$ H5 R' R4 I
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount()); # [( _0 [) b) c2 [" l" |: O' p9 C stack.traverse();4 A5 r' p: D3 a' r1 m1 P
0 X; Z) X1 K% C5 H: c: _ //栈中无元素,出栈报错6 L5 F1 V$ {" ]7 R% i9 F( u
stack.pop();* o& }) G5 X5 j6 R/ j9 P