7 P/ j- O% r! W8 M, g8 A 4 x' b- E8 z0 e4 d一、 栈与队列的定义$ W- u! G( `4 E2 {& m6 k( w
栈[Stack]:是一种限定仅在表尾进行插入和删除操作的线性表;即后进先出(LIFO-last in first out),最后插入的元素最先出来。0 U% G u! W$ z. M$ H! p
+ e, Z/ O7 q' r. o4 G7 U" @5 r二、 用数组实现栈1、栈的接口定义 3 i% h+ b3 y( h5 j/** , V* H3 M* Q7 u * 定义栈的接口 $ O" b' p1 @; M% N T * * o9 u* m# h" Q4 W: V8 ~# W * @Author zhuhuix . x H& A' V+ I * @date 2020-05-01 / R, [4 s7 _/ T: K" N G: F */ 6 J7 g/ z+ S9 L0 D3 gpublic interface Stack {8 A* ]+ N6 W+ r" o$ J
/** : X0 X) V/ G& l* X * 入栈' N- ~) e9 t6 J/ d2 N! h
* @param object 入栈元素8 G- y$ _3 J3 Y* B8 d
*/ ; T+ N% H% b* N T void push(Object object); ! n5 N, ]& d( J- B5 c1 C 5 \8 T' G0 K/ L. F" b$ K /** # b) h; r( \+ H$ \ * 出栈& m1 L; t( w3 T8 }' H: B% m! x# v$ b
* @return 出栈元素" U* y- g# J/ r- |+ `3 u5 [
*/ 1 } Q# v9 n! s: Z& ` Object pop(); 6 t1 Z% U0 g7 \/ {: E8 J1 m; g" t: E$ m) p
/**( R0 I5 `$ c9 A( A; u9 b& h
* 获取元素个数 9 L$ u1 E# J ^) K * @return 元素个数& _* @$ g3 z2 y5 g0 T
*/ _0 e- F+ x0 G1 S) K' x
int getElementCount();: E; ~+ E$ N' J6 p6 O
1 P( _! h+ |: y; k$ p' q /** ; b, Z9 {8 v6 d \2 Q * 遍历栈的元素) Z4 e9 |, [2 E4 }$ W
*/7 X4 L: Q; C0 V+ J3 @* ?( f2 C ~
void traverse(); # q9 E+ U( Q& @' b! g F7 H , O, z' @6 v( J8 g' C3 `} ; j5 J1 g I7 X9 [! B2、栈的接口实现 7 g) W" N: J0 h* h+ n/** # T9 r: P( |: ]& [ * 栈的接口实现 4 y$ g! }; E4 ~4 h *" B8 {+ g2 a) f0 ^: I7 v" O
* @author zhuhuix( @5 P* d. r& z
* @date 2020-05-01 % d- f) v& D' k- i */0 _% b( J. V, R6 l* A% k
public class StackImpl implements Stack { i/ i' M3 B' M " q1 t5 c% A8 {2 v1 L
protected Object[] element; & r* L) S" T" _! _4 ~+ T2 i8 V4 M3 H# l
protected int elementCount;9 Q: y! c" ~5 d* t, h& O/ y
$ ^6 O# I6 D: [0 W1 d private int defaultSize = 16; ' b7 P2 @; h4 \) q4 f% b) ?7 I. v$ G& ?6 j
private int maxSize; ) N7 {/ l/ L: V- q- G- M2 c+ q' ?3 \. s& n+ T; ]
StackImpl() { 2 S5 w0 ~4 {5 M U1 J, p element = new Object[defaultSize]; ! P8 R" p# l6 g3 g maxSize = defaultSize; ' ]' n6 ?0 e6 A6 ^* t3 x5 N# j+ l; w } 8 e; V" ]0 A) `9 }5 Q 7 U- \) s& Z1 ]; j2 G StackImpl(int size) { ( A: i2 N( {- b, e) } element = new Object[size];/ g6 `0 I* `* c. t
maxSize = size;( n, s) a a! r/ y2 V4 k
}# y( A0 v" @+ q. y+ e/ b
2 Z3 |: V0 S8 C# \, H. [# w @Override" {( r v X4 U2 g4 E3 V
public void push(Object object) {7 X( D9 Q; [1 r
//如果元素个数已经达到数组的最大个数,则进行扩容( m# @6 K# A# V" Q* \+ W# `4 c
if (elementCount == maxSize) {0 M, `, F1 h5 G2 G
element = Arrays.copyOf(element, elementCount + defaultSize); $ u) {, r. j( J3 O } # W; ^5 l$ C8 g t7 m" |2 }8 e element[elementCount++] = object;* q1 `* i/ ]- ?; J. m$ a
' l2 F( {- d4 }* ^$ N4 I }" \) W& S9 M d4 c. g6 C
// 本代码未实现数组的自动缩小,具体方法可参考JDK - |6 E8 ?+ q6 Q4 R" w) m8 {8 b- n @Override9 |' q# G: d- V" n9 x4 N, Q; X" s
public Object pop() { - h9 P: I2 O( a if (elementCount == 0) { 7 H6 b; c. @4 T8 E throw new ArrayIndexOutOfBoundsException("栈中无元素");6 B& Q0 @1 O' ^1 g6 ~
}( J5 i$ ?. h& W5 T# F( t
Object object = element[--elementCount]; ; q( [3 j" J4 \ element[elementCount] = null; 0 K4 [/ @! y; z5 g9 r& V; M return object; - o# {6 X7 u/ [& E% K Q8 o8 Y. q }$ E: U; M. j% M2 O/ e
; g$ N2 {5 h' u1 `0 B p7 j @Override 4 f# x. z; x2 Q9 J& `- X( B public int getElementCount() { " R* t* P; G9 h/ _* F6 c( z+ V# f return elementCount; $ e; ?* d# e7 d) R$ U9 q } ! I; ?% _$ _9 V2 A: E* o! G9 e D( e! t) u7 H, i! p# j3 n
@Override * ^& J+ Q, M0 n4 x public void traverse() { $ D8 g: B: y X" i, ^ for (int i = 0; i < elementCount; i++) { # J! W# f# Y8 j$ F8 _ w4 X System.out.print(element + ",");) B9 Q/ x* ]2 Q/ @
} 6 z1 K4 A/ ^* o5 R$ d System.out.println(); 0 H U% c S2 f R } 6 L j% N3 U1 T}8 k# P1 b5 T* p9 K" n 3、栈的测试 & X9 l1 w' Q7 S( D7 m2 P8 G0 Hpublic class StackTest { 6 d! N& y' v& K1 F. M public static void main(String[] args) { 8 }% V2 E) }' i# W Stack stack = new StackImpl(); 9 W0 z$ _* D/ j4 C2 }, o, ` 8 F! W* [! k' R //第一次入栈:压入1-15 ' o8 t3 @, t8 U$ w2 M2 J for (int i = 0; i < 16; i++) {+ E0 V& T) S5 @
stack.push(i); 3 l+ ]+ Y0 W" ? }" `" o& l9 o8 b
System.out.println("第一次入栈后元素个数为:" + stack.getElementCount());: \; @' [/ f+ A3 Z
stack.traverse(); ! }6 P+ d) `" i" H/ c( k- X) }: x4 h2 X: b; l
//第二次入栈:压入16-31" s6 G0 n: n) R8 m3 z Q
for (int i = 16; i < 32; i++) { % C2 R5 f1 ~1 G( v: }' Z5 G stack.push(i); + o2 P2 k1 h1 _* v1 i7 ~ L9 f" z } ) T! h* y9 q8 _. T System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount()); % P: R3 C5 L+ H o) ? stack.traverse(); 2 k7 `, z$ W) y: u6 x2 _3 A$ O7 a7 u2 f6 W/ C" q5 S0 W
//第一次出栈:取出31-16 ! W. c, V0 E5 m. ^7 ]3 R d for (int i = 0; i < 16; i++) {5 ?* \* M* h8 ?8 j6 w2 p$ ^
stack.pop();1 @& {- ^+ G; B" \6 W7 s
}8 D# h8 |4 _. n1 o; i. ?
System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); 8 g2 f/ O* b1 A( F0 r* M stack.traverse(); * ?# r" s5 x& Q! n9 W. k" s! h9 }% }
//第二次出栈:取出15-0 Z' w( m- D$ l+ P1 Y8 c+ H# h for (int i = 0; i < 16; i++) {* M$ c9 z& G4 K i1 e- S3 g
stack.pop();% D% @' Y. h) A# P
}9 {/ ~$ t- k" k" b7 P. o
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount());6 A# a# x7 Z+ F! E ]# ~& o/ r
stack.traverse();4 w. ]: u. g% ]( f$ I/ _
$ ^9 H% R) O4 F5 ^6 j
//栈中无元素,出栈报错 ; K ?: r+ P; T) Y& v) c stack.pop();. f) o$ C3 n8 K8 @* b
: J. n% N( q* C" n8 N0 e }0 L# @4 }, v" T7 C5 }# F' t
} # [4 v' G' L5 @) E