/ v& A# H# m* i" L. W p' q二、 用数组实现栈1、栈的接口定义 5 ?' I2 n8 R8 ^, y/**: a {3 v$ n% {2 }5 Q- r
* 定义栈的接口 % \9 U, \" u/ w k- Y" H * 1 O1 [5 t, _5 C2 r * @Author zhuhuix* c: @" {& a! }/ G8 ~& q( N' y
* @date 2020-05-01 $ ]- ]& U/ O9 e; r: ^ */ ( }" E. K/ a4 w9 \% E) ]3 u& cpublic interface Stack { 6 s5 v9 e8 T5 Y /**0 o4 S% n9 }5 O- d" T2 E
* 入栈 : ^# |( V) j, A# P+ q * @param object 入栈元素0 l+ ` [- T5 A+ C
*/$ F: {+ p) `2 }1 x; G9 T( r6 i
void push(Object object);% y" T* x+ l8 B4 ~; m" H* o
! _) f3 Z5 ?8 N3 X8 { /** ; y$ W" {2 @ J5 z) P M1 c * 出栈3 E! C9 M( r. |, Y5 O5 O
* @return 出栈元素 ; C7 U: }6 o4 Q; x */; o2 J H# c# H0 U; E" j5 a0 U
Object pop(); g5 J( j9 o& D {8 H! V9 ?3 P1 X7 H6 o' O
/** 8 P. ^+ [% Y6 Y * 获取元素个数5 y. t V: v3 F( N7 l( G
* @return 元素个数 7 T- a6 N$ h! R6 M0 Z" L# ^ */ 0 r6 R- U6 `% [% A int getElementCount(); ; m) ^2 |9 \* l" p) C9 r' }) ^ E7 \6 q
/**/ X9 N* V/ U2 ] a' Z+ G
* 遍历栈的元素% g- V2 K, A$ a# U) J% ~
*/ 8 }9 B7 F( B- Z6 E. n void traverse(); $ y$ q) F9 v# g+ `! k" k ! P6 k( Z; u# d. ~) S' M}: b" g- R5 v% V* `& Q 2、栈的接口实现 % m) l" x; R' W5 H! E( i: r: T/*** q+ h7 N4 \7 s3 w8 L2 M) ^
* 栈的接口实现( H+ |' m& O; x2 W
*3 e0 n* a5 Q: B( g: B9 [0 _- G
* @author zhuhuix 4 @9 c1 B$ i( C: k * @date 2020-05-019 _& ~3 k7 I, k8 _, ]9 W( t# A
*/$ U" R, a. S: {/ w3 p. b
public class StackImpl implements Stack { : M' g2 M3 T4 e$ d) B) g! X 8 `7 y- r* Z" y: g protected Object[] element;8 U. f, u/ H; g9 j7 F) k# u
. B1 i3 D: Q; X+ W' I protected int elementCount; 0 w# y s( X" E( w1 K2 _6 g% e7 W# D, @0 [$ ?7 a% z; V$ ~2 X
private int defaultSize = 16;# S2 R7 y8 w% Q1 l' @3 c3 k
) R! z. v! K+ Y( x3 G private int maxSize;' j% Z' z2 |( d! Q
# N) j3 Q/ H1 X0 I; W
StackImpl() { 2 Q: b0 B* L) o* i! G" D element = new Object[defaultSize];- p U7 i' b& w0 C
maxSize = defaultSize; 1 z7 n. W7 W& s7 l8 n& D7 M }% d& X. [* G: r% N" _2 M6 D
/ m; n6 X% c* F6 l9 _% r/ ?& V. o
StackImpl(int size) { " l1 Y/ _0 m5 }) F1 p: ~4 C5 H element = new Object[size];3 n- R* V% u* i* L0 p& g$ U
maxSize = size; $ R# z: \( }8 f; \1 d8 R& x# c }. _7 r- I. g5 n
% v# U8 t6 c8 x Z" b
@Override 6 Z5 z4 T- @. @! t4 U; K public void push(Object object) {' S( m( |: C! A; v" s% r% u) a J
//如果元素个数已经达到数组的最大个数,则进行扩容( {8 O$ S! r. n; e- P% O
if (elementCount == maxSize) {! N9 q0 N( s% t, d0 B
element = Arrays.copyOf(element, elementCount + defaultSize); / t4 }' v. q9 D* I0 S }: V* {# s$ }- e
element[elementCount++] = object; # g5 P' d: y' e/ L7 p8 }+ t$ J8 z# y; \6 v( g8 {, ]. a4 u0 b
} 2 |2 k* u" R+ C, i8 P+ T. Z R$ @ // 本代码未实现数组的自动缩小,具体方法可参考JDK8 B7 Q( G3 u6 n& _9 s# ^% e# D' n8 I
@Override + G& M5 N1 V) r3 l# [ public Object pop() {. Q! ~/ p: q5 _
if (elementCount == 0) {# a/ {/ Y( S% S8 a! ?/ q( y. L8 e
throw new ArrayIndexOutOfBoundsException("栈中无元素");, ]8 F# V; N. s: Q# ]
} 4 d: l( ?/ k1 N' u Object object = element[--elementCount];6 Z* p( k6 w4 n4 U9 g: c
element[elementCount] = null;4 h: B9 R9 S' Y% M
return object; / {& F# H/ [; Q. X }2 @* U6 ?6 b6 Z7 W: K
/ D3 A) A+ K1 I- w }! o0 O @Override& \7 m& W* o a3 @! P" }9 _3 }% S
public int getElementCount() {1 o) s( B) |/ X+ \! E
return elementCount; ; v" k x) r$ N5 [9 r) t } C- W) O9 q: F; v2 i) b" ^
) W' D; Y2 ^$ e6 o @Override% u/ X! j5 r+ j, H
public void traverse() {4 m9 A' B1 S' s& v
for (int i = 0; i < elementCount; i++) { U, e0 f& M3 T2 ~
System.out.print(element + ",");4 N* [6 q5 F3 k" c
}9 p8 K' j- f) m
System.out.println(); - F5 X$ Z- U; S0 g }5 V" {( V$ m8 Y6 i
} 4 [& o; L$ [. Y$ N' u3、栈的测试 , C) v6 h# C, U6 ~" u5 j& m+ Z* ppublic class StackTest { ! A4 r% m% j3 V3 I2 D* Q public static void main(String[] args) { - B0 q4 A4 h- F- ?5 T- g Stack stack = new StackImpl(); ' r4 _; |! e2 d: h - e6 q2 s0 _* B- L& p1 r: m //第一次入栈:压入1-15 3 O) R5 X" G0 y for (int i = 0; i < 16; i++) {% `6 D* u% S% A, h9 j6 i
stack.push(i);5 w/ c: `& c. {! S! |4 J
}3 K/ o/ a Z; {& W* C0 u6 L! `
System.out.println("第一次入栈后元素个数为:" + stack.getElementCount()); : N" u: e! ^: K, Z z: D* f stack.traverse(); / }! e* H: U0 t2 `- ]. W- U0 ~" P1 r( ~+ Z
//第二次入栈:压入16-31, m1 E! E- v! `: x
for (int i = 16; i < 32; i++) {6 e' A. `) m7 D+ B- ^& x6 s
stack.push(i);, e0 A3 E- j2 T( I
}4 k0 R6 i/ H; I
System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount()); - G. }; h6 b( ]- C stack.traverse();7 n# g# S+ a7 p9 i
! O0 W8 k0 I7 E' C' A4 G //第一次出栈:取出31-16 * Z/ w2 j% [9 z2 E8 _ for (int i = 0; i < 16; i++) {0 n2 s. P+ O; q2 k1 {8 z
stack.pop(); # p) a: b' d( E1 A; v" O } + [- M$ ]# Z- H; W" G, Q' q$ b: q& c System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); % S% T( F# v3 n, {+ l# o% _) F6 a stack.traverse();& F, ~1 d! i) L, c9 _7 q5 x- _
' {. `1 f( M! Q# a6 ?6 Z //第二次出栈:取出15-0 ( S0 M8 d9 s$ g1 z! Z7 R' W/ Y for (int i = 0; i < 16; i++) { 8 u5 |* D/ b, w stack.pop();& R- b/ C9 s8 b, M4 _
} + E' Z( j e% ]0 J System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount()); 9 l' e6 @( T/ u! h stack.traverse(); ; m4 y7 l5 F8 ^" B" S3 E, e- g' d4 G3 v k! e; E# d
//栈中无元素,出栈报错/ E8 m _8 O$ M/ K% _3 Z
stack.pop();4 _& g! }! e1 t8 c6 c9 ~
2 S2 q8 H- r) s C7 Q) E }8 _3 ?2 F# ]6 z: R" p% Z
} $ z$ Y' X; Q3 F5 q* ]! Y$ H: Z J' W