# S* E7 q& x) `. n' ^. U1 f二、 用数组实现栈1、栈的接口定义7 c0 _: ^) G2 ?) {
/** - q$ N: }7 V$ e# j% ^1 r * 定义栈的接口4 L3 m H$ |& n( l l
** v2 S( k# ~! \( X& R( B
* @Author zhuhuix / Z0 t/ r& J1 Z! V: n0 l& i * @date 2020-05-01 5 |: L$ B7 ~* \/ ?. p+ Y, E */ : l/ n1 L; v/ Y% ]6 Z4 L( q, [public interface Stack { / p8 l" a- Q1 N0 }! @ /**, W( O! J& L: G9 k" J. k# f: c
* 入栈. D8 U" b/ G! A5 ^! O
* @param object 入栈元素 , ^( Z( ]5 P5 R6 G */ / J Y" W" O# Q6 a* e void push(Object object);* e' _( ?4 v7 {+ i* D) w1 P9 \5 I
' I9 o9 |6 T0 p- p q' M# X; y. p
/**1 V) w& b8 t5 O" C7 V# \3 n5 M' g) B
* 出栈 ( |2 o7 R9 V B0 A. J) u/ r8 d * @return 出栈元素 1 E* w9 o+ i+ ~( ?% ` */ 1 H" ~8 j" |, } ^ Object pop();' Z, B* }/ K( g l0 r( S, s: X; s
2 I9 `. b- p$ E }) I
/** 1 q. Q) c- g; o/ c * 获取元素个数 0 q2 ` l$ D. D9 f5 j2 f$ B * @return 元素个数: c- p6 C }- A5 |1 e% {
*/- m+ e% }* N+ N! b# J6 z8 Q
int getElementCount();$ p) b7 b. `5 P; s
" L& w, K4 Y6 U( s, X5 w- s7 g: p
/**9 ?; Z1 P1 j" v; u0 H
* 遍历栈的元素 ! N m1 N. `3 c. L( e */5 \1 d2 z9 c1 y3 i& W! ? p6 U" f
void traverse();/ d* ^ P& J- H0 t
+ h3 U) @) n' ]- e4 {2 m+ U; ]" }
} 7 m- Z, M3 T7 }+ M2、栈的接口实现4 Z5 j7 O; f3 ?5 j- w' R
/** ! i3 B1 E4 f3 A, s8 y! B * 栈的接口实现 . F5 e* k) p/ k# v# T+ q& a *( Q2 P- j' }! q- K
* @author zhuhuix ' w* c7 g1 q$ A8 \+ A. F * @date 2020-05-018 q, T2 z# c( _1 b# ^
*/4 Y6 L; F& o7 k6 ?0 C$ A
public class StackImpl implements Stack {$ R; v3 @5 [5 X" j' z
- g, k; Q8 I' a" u V6 T5 z
protected Object[] element; : ^- H2 B1 D/ u* R4 t8 }7 A5 |3 [$ i0 W/ d' m, w: W* U
protected int elementCount; ; M% Z% ^7 i* w' n" b ! E$ o8 |0 K, C) h q6 t. y* k private int defaultSize = 16; 3 H. g! s; M. E K) u* E, x: ]% B8 g3 N1 t" b0 Y
private int maxSize;1 _9 A1 b q. o( A. }
4 t$ j ^ `) r7 p9 _
StackImpl() {3 ?/ K1 o" z$ \ B+ Q' {& H
element = new Object[defaultSize]; ) l" Q/ o4 t) K0 V+ } maxSize = defaultSize; / l" K' D$ K/ f% ~. Z! } } 0 y3 m" ^6 @- k+ w0 G1 f5 u" Q: W3 [
StackImpl(int size) { # i9 j- H& {& H% v element = new Object[size];# T- i; ]4 c& y6 E$ p+ E+ m; P
maxSize = size;" S+ j7 J9 y3 q4 P- s# v9 w
} ; H$ S, Z4 Y8 u1 K4 K0 f% V2 y0 J- ~, N) }3 d7 U* K
@Override# N9 {! V, N% H: j' M: V
public void push(Object object) { 4 }- T# ]# u' | //如果元素个数已经达到数组的最大个数,则进行扩容6 r6 r& R9 J6 U9 N1 `3 H
if (elementCount == maxSize) { : \' p4 v" G0 c. B7 ], r6 M element = Arrays.copyOf(element, elementCount + defaultSize);; o( f5 T) F2 A6 c" g
}7 l o7 p, M! ]
element[elementCount++] = object;! D8 g* w0 N; ?
6 G4 e$ b( G5 ~ } 7 H7 ^' Z f* Y, R/ v. D- j1 L // 本代码未实现数组的自动缩小,具体方法可参考JDK , V. y7 I1 p1 G+ o! A @Override ; |9 s' S' c5 M8 c2 F9 q public Object pop() {5 l2 q0 D; n( N; r; A7 e- E$ q
if (elementCount == 0) { # J- }% T; J3 t throw new ArrayIndexOutOfBoundsException("栈中无元素");$ F* |, O! b: s9 Y" w/ d) M
} . {8 {: {1 a8 @ r Object object = element[--elementCount];8 l( z# Z: u' a1 b+ O2 H, T9 o" Y
element[elementCount] = null;, o2 P3 G3 O* {/ q" B3 t8 z# c
return object;: C- d( T: Y- c; A/ a
}4 _0 i7 B M; [% l
: s# q/ o4 \0 b7 f0 Z @Override( j. y+ ~! B% R1 k
public int getElementCount() { # w% W) |- r7 w+ a, i return elementCount; 3 X4 d' V$ T. `* p' M }' A+ v# l; G/ y! x4 Y5 ?( z" u; W
* m9 ~2 O" h: S/ m; L% m r @Override3 A( Q( O% S$ I6 y" P% N
public void traverse() {" p& x9 u7 S! e
for (int i = 0; i < elementCount; i++) {1 @4 j6 U% Y$ t! ^. C9 J+ y
System.out.print(element + ","); d8 e) V8 o. ?+ M1 }* r. G( f }7 P% K* V0 r3 A' X# o7 }& L! s
System.out.println(); " Z+ A& _! D" ^" x/ y# @7 F% ? }9 r! s/ W( X2 s! p9 f; K
}& q) }! H1 a9 q; Q 3、栈的测试 4 Q; W/ l) C8 Z: K! ? ~2 ^public class StackTest { : l. g1 t0 r' w) u, { public static void main(String[] args) { / S4 s" p; a/ s: y Stack stack = new StackImpl(); 0 l6 J. n3 i! c* m: C+ E: _ ^, {; E& Q) M: Q7 c2 Z& f9 [
//第一次入栈:压入1-15 2 {+ C" e7 X; w7 R1 @+ `, u for (int i = 0; i < 16; i++) { 8 C+ p" k9 l% e7 K4 y stack.push(i);% {& r* g- \" \8 a
} 2 O7 q. k" s1 P9 j8 m. h- m System.out.println("第一次入栈后元素个数为:" + stack.getElementCount());0 L% E2 t6 k7 U7 b+ r9 `
stack.traverse(); 4 S' [9 w& x' ]6 u, h' t) }. q& \ 2 z, |( F+ P+ Q //第二次入栈:压入16-319 @: [; m- Q1 ~( u `+ d
for (int i = 16; i < 32; i++) { " W2 |5 `, r3 N( {! k' r/ d stack.push(i); ! j6 t. m* K: e5 A% X } / V# ?% K: e# A+ S: c System.out.println("第二次入栈后的元素个数为:" + stack.getElementCount());" U; A8 @; C8 g- ^- N, M- T
stack.traverse();) s* C, m8 \% j3 J/ K( [
# v6 U& L1 p. l k
//第一次出栈:取出31-16* X' Y( Z# ?- K
for (int i = 0; i < 16; i++) {. y7 w! x1 T x, k3 p4 h% H
stack.pop();+ b! L; a: i( T3 g5 n5 @
}1 ]4 _$ }4 M# A7 I+ W ~% E7 J
System.out.println("第一次出栈后的元素个数为:" + stack.getElementCount()); ' z# G5 r! ^& R stack.traverse(); 8 d2 J8 k6 ]0 ]0 g$ r6 d2 l. M# F
//第二次出栈:取出15-0% e' P! a" u& d6 }+ d
for (int i = 0; i < 16; i++) { 1 }5 }" f2 f/ q" f# V; r stack.pop();6 r( a: J; n7 j9 f2 a; i/ s! i
}& S0 ~' B% d: A0 ^# Z
System.out.println("第二次出栈后的元素个数为:" + stack.getElementCount());' D# v, O( p I: }. P3 K
stack.traverse(); 0 W; Q) {: D0 D7 w. a$ U: C6 a6 D" `/ i: c* q8 r
//栈中无元素,出栈报错( l5 B4 k4 y2 A7 c
stack.pop(); 0 H; L3 I! h( N/ r. w+ U0 W/ G5 t9 H
} + w- o6 l0 I# o! j% v1 q1 N% f}. }. T1 P/ P0 B( P: n
3 O; y" s$ V7 A9 Y/ j ' I/ m% \1 S* |5 y: q, y. z3 s7 m: e- t: {/ o- M$ l
% F2 [" G9 C+ B% e+ T+ I5 K2 T三、 用数组实现队列1、队列的接口定义/ m' F) ?! Z& X; F, A4 V: f
/**8 p" E( J \0 w* ^3 \: u/ d
* 定义队列的接口1 U' c1 N- m* E; ~# K) s
*5 d d B1 ?: W, N1 v
* @author zhuhuix ( j4 w+ H, R; @+ i( z/ d. y4 D4 t * @date 2020-05-01 ) y1 ~; i, m* ]& Z7 R */ % H. B; r0 t, Cpublic interface Queue {7 A9 s) c& |/ \1 O" I( r# Q2 R
+ F: c2 c) w5 A /** ) L$ T3 |. r0 t# h# X9 s * 获取队列大小) [& }3 h9 B3 q1 Z# d" K
* @return 队列大小/ n- R8 t+ n y' A6 @4 Q
*/ ( o) t6 i4 h. B int getMaxSize(); & U9 j. O+ \' {/ }8 |: |# S8 A$ N1 L+ {! h8 H! f
/**/ b2 ^9 [# M( I" k. A
* 入队- g8 ?) {6 \9 r$ ^
* @param object 入队元素% E% o$ z4 c* z/ W& B
*/ " ]( Z* Y3 {7 _* R& R& w) I0 } void push(Object object); 8 J; p$ P2 ] s% s7 n( F$ o. a" z4 q" s8 N9 `
/**- a6 G; I8 y/ W
* 出队3 e2 H$ f* O# L" y5 z2 k
* @return 出栈元素/ e+ u4 t, s: x: Q9 {6 m
*/ 8 @/ @3 q8 T% s* V& C2 d: F Object pull();+ t, y! F5 s7 i+ `7 f b1 C
: d9 L l, U) X- ? /** ; V$ a) u6 ^+ Q& O# ^( B1 D * 获取元素个数 $ U. B$ P: ~8 ]# }9 c9 W * @return 元素个数 4 U: }! z$ ?6 K8 _- Y */ " }7 E! z1 d. W- H/ b int getElementCount();1 A3 J3 s% p5 {( h: e
2 n% W, w- j+ b! O1 | /** 4 y$ y( ^7 J- g0 M1 A * 获取队头元素/ O6 s4 Z. B( L
* @return 队头元素/ c. j8 P( r. T+ g
*/& A- F" E8 y/ w( F* V7 f
Object getFront();- I r1 m# T, |( f" r
& {, f) L/ \9 S1 c" k* N3 q+ ?; f
/** / `7 i! ~* i0 Q! Y * 获取队尾元素 4 J2 h$ [1 H5 O7 }% ^6 R * @return 队尾元素 * [5 e2 p# u7 p3 z */ & @( j, [+ a# ?& E Object getRear(); + V, b1 U# c; }3 I & m7 ]+ M1 w d. g! s0 ~ /** , I' y* |% |" h6 \0 e * 遍历队列的元素' X- A0 h& O9 b2 x& }+ Y
*/ # b( L- M( L0 ] h void traverse();6 q. Z: |4 F: O" i0 c
} # Z- J' j5 N1 G, H7 I! { E2、队列的接口实现- R5 a2 Y+ W1 }/ L
/** 9 C# H! w1 K) K/ T. r' @ * 队列的接口实现 8 b8 Y- t' B9 J! u/ s- B *+ D' K- A* M) ?9 g2 [; r
* @author zhuhuix2 C5 R$ D0 U7 b( U" ]% u
* @date 2020-05-01. S. q& N+ R! L& V3 `
*/+ U9 z3 s% r- e$ X) L, ?
public class QueueImpl implements Queue { ; y" z2 L. x0 b - W% F/ ]; X# w9 V protected Object[] element;1 |, k2 \! `9 K0 R. _+ `' E
) m# _5 U5 B9 E {/ r protected int elementCount; ( T7 M) A7 }2 z( y" Y* {* E* X$ f# V$ C
//队头 R Q' w- w: @$ V/ o3 M; c* b! c
private int front;& t8 B/ A) G; |; `* r% e; u
. J2 g, {, u% t5 {9 n3 Y/ y //队尾 $ m U" M8 P( a" l$ J" w private int rear;. p" x7 j. `* \; q& o# u/ X
9 G7 _+ t( E- u$ N7 d! _, P# I private int defaultSize = 16; - N6 ~/ `0 s& z0 q, I$ W) y9 A. H, z: u$ k) X. w' ~
private int maxSize;, y) E3 V+ d9 D
, Z. Y$ f2 e( H$ j9 \3 | QueueImpl() { - d6 W- h- M1 w/ o# d) ? element = new Object[defaultSize]; 7 x) ~, }( y1 |& i maxSize = defaultSize;0 T: C2 t* U; T& n h& v: `- A" u% e
front = 0; . d1 }2 B( E5 A! j4 Q* a0 G8 ~2 | rear = -1;$ g' U4 u" E h; ^
} c) X5 q8 ?" ^, k, W4 A+ g# c; l6 U9 ?
) L1 J0 ?6 I; s' T) B QueueImpl(int size) {+ ~8 F1 G; F9 J' |
element = new Object[size]; # L/ Q5 z' [ ?$ _ maxSize = size;( J9 H4 ~0 e5 k( g7 S- F5 P; r
front = 0; / a: P# k5 B( D* C) e+ x rear = -1; 2 Q; r% n& M3 t; S! }1 ? } 8 h( o; E, x7 ?5 x! B + @# q- o( i& w* ^4 d% Z7 { @Override& z# v9 ], @: f: C6 v1 Y- I& K
public int getMaxSize() { 7 U- x) b4 D! O! M' ~# p9 H return maxSize; ( i0 F( R0 f( T: i1 \; f } 5 p6 [4 q! Y" f6 e* e" }$ k( _, j7 A* ^! | [* S9 @
@Override7 y& N" f; l3 Y5 C; Q
public void push(Object object) { . a% [3 m6 ?2 S$ u& M _5 U //如果元素个数已经达到数组的最大个数,则进行扩容+ W7 H' K+ T4 W0 j# f; w; ^
if (elementCount == maxSize) {2 a2 K- }% z- {; f: l" Y% E6 ^
throw new ArrayIndexOutOfBoundsException("队列已满,请先进行出队"); , D9 {2 v8 U( Y% h: l( L }" G! c R1 ?- d% M' ]
element[++rear] = object;$ k1 Y& C3 T+ ^- \4 Z1 X9 y
if (rear == element.length) { 8 K4 K9 }, ] `4 k- P/ |* Y rear = -1; ! }% l3 E6 h; p6 y" Y } $ c7 L4 y5 {% `0 F elementCount++;# \; M) h* [9 h5 O5 V
} ; d+ R, Q( X- |; M4 L # b7 [6 C- i) D3 ^ @Override7 c1 Y) }5 f9 ^ U9 @5 U; s
public Object pull() {! ?4 D O" A2 b
if (elementCount == 0) {: a# [8 v4 v& h6 }" P
throw new ArrayIndexOutOfBoundsException("队列中无元素");; A3 [! `& M$ X* N" W, X+ F- H
} ! y# |) {, e5 f2 w4 l Object object = element[front];+ l/ t: `$ J, M8 u9 V3 x
element[front] = null;5 b; B; f% o, B- U! \
front++;9 u# q, ]2 a) b) f2 J; D
elementCount--; : U/ Y8 l" O: o! {) a& Z0 r( { //队列清空,队头队尾恢复初始值 2 k: d5 x+ D& T- x5 L; F if (elementCount == 0) {; H; f. w) y2 m$ K
front = 0;; b& X, o. c% U
rear = -1;6 d: J% I6 P7 w. ]# x, ^
}0 a$ ^: ]" e4 {: G4 L6 J9 w
return object;5 L# B2 j, v/ |' t7 l" P
} 6 Z* {% C& e I# N% m" B* Q. b ! h- a, n: a8 L ^( o" x, m& l) t% s9 L @Override 4 a. u L7 G: ]1 @7 i% e7 { U public int getElementCount() { 9 a# q1 R$ b0 l5 H. o return elementCount;8 y+ j- q0 G& N2 @1 O
} " O. q5 L# f. o0 P' ~2 R% Y8 P4 I) c; Q) x
@Override : X) k1 t* X( U: o7 u3 b public Object getFront() { , O( ?$ l# @7 }# i% b3 Z& t1 j: J if (elementCount == 0) { & B1 `2 t C! G" j1 v System.out.print("队头无元素");1 h* O* f5 M% G7 M7 _0 o2 z6 \
return null;9 L1 ?+ o6 Z3 w" v
} & z B/ q' [( F# ^% j( o" ~! A return element[front];- U' l2 z5 i" b. D* n
} 1 P! _9 d8 J0 S5 u8 ]5 G$ N5 A0 l4 K K* Z, f
@Override0 f) u. H: ?3 d5 l5 A$ Z
public Object getRear() {# D. q0 i5 j4 k5 X. f+ F
if (elementCount == 0) { 4 t( Q/ q0 l4 F& ^7 Y4 M System.out.print("队尾无元素");0 A6 C& X+ I* E1 L2 Q u
return null;1 h1 K* N: x6 o3 Z' D; a
}1 J [; k8 m, g6 N& P. F+ m8 R
return element[rear];+ R v5 i; [2 G& v7 {. t, h
}8 l% v# ~, p) ?1 m! a+ ^. R* Y
) Q' G. Y( w7 ]0 n% p9 H1 z @Override 2 Q/ B4 M) @) E& i# ~4 {- N4 B2 V public void traverse() { ; q u# x4 {/ d/ f if (elementCount == 0) {4 b% V: G7 f! \- M: f5 L$ e) j! @) M
return;0 L& P7 ]1 @# k
}4 H7 w3 S: C8 a+ Q9 S1 P4 t1 m
for (int i = front; i <= rear; i++) { $ v) ^+ Z8 U" ^. q- I; D System.out.print(element + ","); / Z1 ~. @ a# r3 E) s# l- y } 7 H: E1 ~' y$ j9 Q _- J0 x# ] System.out.println(); 1 z) u8 n& z6 p, d2 L: @ }6 @1 |" F4 m% H
}7 _5 W2 _8 @& Z4 q( d& x3 G
$ [$ d3 E* r! P 4 u J1 A: S$ Z# H& U u' N& x4 @3、队列的测试5 X1 F, }/ Z; A( q6 @3 p8 H
public class QueueTest {- r j' c3 y- W0 u0 U1 m; x
public static void main(String[] args) { , `0 h3 W+ z1 ] h' i" M) Z7 C' d, [ Queue queue = new QueueImpl();) N. p" ^ S1 B+ B: }9 G
3 q' d* X4 N0 G/ F //获取队列大小 2 Y' Z( n+ s3 |- N System.out.println("队列中最大可放置元素:" + queue.getMaxSize()); 9 b7 E. _% g! b0 a) ~' a! W4 d7 W0 c9 m" @" Y) @ t
//第一次入队列:压入1-15 B3 S: W1 W6 @' }8 E/ E
for (int i = 0; i < 16; i++) {/ r$ E# u, ?, {( S
queue.push(i);2 |* t# }, l# b
} 7 f4 y, Q( f$ O d& X System.out.println("第一次入队后元素个数为:" + queue.getElementCount());/ R0 Y: Z7 i2 o$ B4 K9 {$ f: H. L
queue.traverse(); . o2 ^ `1 P* s$ T2 U5 g4 { System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear()); % o+ @! W' n1 j1 m0 b / V" z5 q. w0 R% I- Q //第一次出队:取出0-15 / P9 `( X7 d+ } for (int i = 0; i < 16; i++) {' m9 s3 u- e) [+ p- ^
queue.pull(); I3 f) V# O l
}. Z% ^8 r) v4 X3 ^
System.out.println("第一次出队后元素个数为:" + queue.getElementCount());: z1 M: n5 c5 p( u5 B, q4 Z
queue.traverse();# }7 v, G8 W6 C& p2 I
System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear()); ! m' I1 ~+ D4 s' a/ j, b& r- x - P( J- {& p6 H/ Q5 G+ z o7 P2 U2 Y# G& A4 B: w' r //第二次入队列:压入16,31 - |( F: X- e/ i3 w1 h# D for (int i = 16; i < 32; i++) { ; r6 |! w: t$ a/ O queue.push(i); / g3 w& R* m! c+ y } & e; k0 J. L* z) z. K, g System.out.println("第二次入队后元素个数为:" + queue.getElementCount());: x5 y3 ^* g/ K+ n. g# F
queue.traverse(); ) a; _* B" t; X# e' R8 O+ v+ f! q" J( U5 Y
+ W* N0 b) }! `6 S! ^3 O //第二次出队:取出16-318 B* I$ W9 x$ L7 D/ @
for (int i = 0; i < 16; i++) { # @$ \' p! t# g! f; q1 Z* Q queue.pull();* y, W8 D7 {% n
}1 z& o$ s1 [# j0 C0 X' e/ @
System.out.println("第二次出队后元素个数为:" + queue.getElementCount());! K" `" a6 ~0 ? g5 r
queue.traverse(); & [( z3 V# ~2 O4 q7 B7 [ 5 t5 E; R5 I: F2 P //空队列出队报错 8 c E3 L# F* l2 } queue.pull(); - @/ F. H& r/ n, h& m6 t$ L. p" Y( {" P( e/ V
} . T5 {/ A& E. T7 K, A}2 h" v6 @" k+ ]6 l. T
/ `: f$ a% s c- ?1 `1 a+ G( I0 S$ i B: c' a
2 @% T- N9 y5 S( ^" i* @9 A0 M; H+ a5 P- f9 S
: U, }# p$ f& k7 s& N- y- }7 g# [/ u- c
* L; W: a- D$ ?4 ]/ O; A% I. G
) N2 d3 @: u% Q) _! {4 @- B+ v w1 p% p% L
x& A: X6 z: [2 m6 m0 t / U: @( U, A- x; N' l0 p4 ~) {; B' M E6 T) j" b9 g0 ^; a$ i
: ?6 K. z2 J; R \; H ^9 |/ O; ~5 z u% _- x) ^! L
" _4 K+ Q9 [5 f w———————————————— , v2 f3 \3 U W; j! b1 v& I. G8 p版权声明:本文为CSDN博主「智慧zhuhuix」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 T" t8 H- S# n# B: C
原文链接:https://blog.csdn.net/jpgzhu/article/details/105876785( A, w6 ~, {& L* J+ [3 W6 M