0 u' ^$ @6 J7 a! [* E/ h : \5 B5 |5 J8 a三、 用数组实现队列1、队列的接口定义 0 ]# O- H. k9 r8 q2 q+ o G- Q ~/**) n. E% i; W3 W0 ], Q$ \/ H
* 定义队列的接口 , i9 E1 ^1 f- M% V * 5 o4 `+ A, {; G * @author zhuhuix 5 O0 d) T0 Y8 E. L4 z * @date 2020-05-01 4 ?! v; F) C! [ */8 N. O! C# I" L% U9 I+ ]3 d
public interface Queue {! t: u/ b6 U. p m ?5 W
( e2 X: H: B0 J l8 [: O) ^. @
/** 8 M* u' d, b2 W% d" |/ ]/ p8 K * 获取队列大小 7 [: N& E1 C$ D* | Z* M. d * @return 队列大小6 t5 t3 S0 W! _) z2 _7 R2 M9 k
*/ ! S+ ?, O- A; E9 L9 O) t int getMaxSize(); , ~: D F5 y% s5 n. M) _ 4 s" P- w; X g- n! _ /**6 z9 E, Z. c. x @( v
* 入队) k8 K8 q# ]9 x- k: {' P
* @param object 入队元素 . y2 e# n5 n; w+ N; U6 g3 d1 R */ 5 h+ l* o. H/ H0 v+ J* d0 V- N void push(Object object);& u" f3 J6 @ q; T/ f
2 E; b8 u8 ]+ E9 ?$ c /** J5 a7 B; p4 U% u. {2 U * 出队 i0 ~0 {" H" X4 d/ T, P( ^3 P * @return 出栈元素& i9 a+ p! ?; q. n2 _. r+ s- y. l$ X
*/ + u! a L2 s/ K' i0 @: b Object pull(); 8 }3 Z8 [# E" H9 u$ z/ I. U 5 |. G( `/ K V3 h2 w /**6 q8 i+ x _. q) o
* 获取元素个数 # D" \; R" E# {' K0 _5 p/ [ * @return 元素个数 $ [; N! [: c+ S5 C: I- w* x7 N */ 5 `2 v- ^9 w% }2 C+ c int getElementCount(); 7 h9 j, {# p5 x( b' y/ y# ^' f; d' i# ^3 g7 ~* M
/**2 W7 Q% P+ u, ]' \2 w# g- @7 m; V
* 获取队头元素 + T$ x( r2 O# y" i$ d * @return 队头元素9 T) D' o7 K3 v- E
*/ 8 k! ?! D. [4 i2 W1 q7 \6 R% ] Object getFront(); 7 r7 J4 k$ c; r5 ?+ G, W- R' C6 ~1 E2 q% m
/** ( ~. ?7 j/ `/ y c; }2 { * 获取队尾元素) ?, y/ _0 P4 A2 Y, z
* @return 队尾元素 - l. A7 D% t- n& e) u *// G9 V9 d/ n4 d+ N
Object getRear(); / N6 \% H9 }- l6 ] * }( t& d1 f5 R! D /**; \9 k! B( }5 Y' b* f4 B
* 遍历队列的元素+ c: U) o& U; k4 ~+ [6 i0 H( S
*/$ X3 a( w1 \) p3 |2 T$ @, L
void traverse(); ( k. |7 t# R& s% l3 G} - m$ ]+ r2 k! v; M6 Q; Y2 \, B2、队列的接口实现 ! j1 ^* N7 q g1 E5 T3 q6 l/** ) z4 R& }. F9 E5 b' u! G; l6 M * 队列的接口实现 % \+ r2 [3 B# D: |( ? *! E" ^; R7 d) @. C/ t) W$ r* n
* @author zhuhuix8 W) n2 @* D1 @% `1 N
* @date 2020-05-01 & J& K. O- S% H/ s6 E1 [6 e! M */5 R- [5 M- W2 o& v7 h' z C
public class QueueImpl implements Queue {9 v$ S8 L) [# R, w( f" b# X
& A* F# K! O8 V% L! [( ~5 q# I5 u protected Object[] element;: O4 a w/ u( l! J+ U: ^
; B% q0 J% s& R& N; d" S
protected int elementCount; 7 }( D3 `: Q+ t" w, F ( C( M" f8 R1 s8 o" o //队头5 a1 g* `+ I0 B% n e0 n; q1 s
private int front;( o- S1 @- x; [( [! l4 D' T2 V
( p; f8 @3 e) T; L0 {3 f //队尾) k- p) c0 e2 U4 v' c4 ?; ]
private int rear; . t4 l x* m7 @4 p. N3 V- a* f
private int defaultSize = 16; % u+ O" ]% O$ H$ \; ]6 n - u- F& R, X! ?/ n0 z& k+ g* O7 t private int maxSize; & D' [4 f; B+ _7 V* J- [ 4 v$ h5 @- L$ w QueueImpl() {+ [: g: k# @& O+ M1 r
element = new Object[defaultSize]; 4 O. V% q/ s; K# [& I2 t2 z maxSize = defaultSize;9 t% q7 q' ?4 Z9 [- ^8 q
front = 0; C/ R' Q* F- c- j1 t rear = -1; h. K9 F' _, y. ^
}, j5 P5 D" e$ U: Z) Q" m4 w. P
, E8 T; W, O0 s, `) B QueueImpl(int size) {$ h8 m j' b l7 l% \7 z3 T' k
element = new Object[size]; 8 H& e' A3 D; J9 p0 U# Q3 U+ l maxSize = size;0 m5 d+ g) |& r* o
front = 0; 8 @! N4 T+ z9 G" J4 Y E rear = -1; 2 V; M5 c2 p2 C0 @: g* b3 |9 h } : K( b( L6 O3 T( K + U/ d# r& P' X @Override 7 e% S# L+ A" p" G2 ~ public int getMaxSize() { 7 z4 w4 b" u2 f* _7 N return maxSize; 1 L5 O+ d: H+ ^ ?# m' J9 x6 c8 y }/ c; ]" b, _. n+ L, f A
9 l8 t! y7 O' ^2 j& \/ Q+ D/ j/ ~& e
@Override 3 j# ^5 B! U: P7 v& [8 q+ h public void push(Object object) { 4 m& A7 s8 U6 R3 K s8 I1 c //如果元素个数已经达到数组的最大个数,则进行扩容 # \) M1 S& u. b/ ] if (elementCount == maxSize) {( H/ _ e+ e( P" x. ?3 @1 k9 N& B
throw new ArrayIndexOutOfBoundsException("队列已满,请先进行出队"); / k: t- d2 R2 n6 u8 M$ H, m } 3 |! l, L3 T0 A3 F1 A( O element[++rear] = object; & P& ~: V" [2 T if (rear == element.length) { % [0 C5 k+ i3 H0 i% o# B rear = -1; * N; `+ b/ u. ?* h f }1 Y2 j8 X9 V, l0 ^
elementCount++; ( f3 @' o! Q# X! r } 8 o3 B0 V2 R% Z+ T- s4 u' a/ Q' ^5 T2 c0 }7 I2 o: I6 Y- g2 Y% w
@Override 0 I& f7 n& |- \3 w! f public Object pull() { 3 ^% }8 Z& G) {, ` if (elementCount == 0) {% {& z) F% K" O' z9 q% n
throw new ArrayIndexOutOfBoundsException("队列中无元素");3 S* C8 c: e( E- Q; t
} ( h; w7 s4 A- `# b Object object = element[front];- t: J7 }$ X4 Y* d- g' b
element[front] = null;, h& J2 v; ?( A. l6 q6 C' O* L: W
front++; $ e+ p9 _; w0 ]3 l0 Y( d elementCount--; * o+ W( f, t( l# @9 O+ l/ u //队列清空,队头队尾恢复初始值 2 p' p4 w8 O) P1 Q7 P if (elementCount == 0) { ) J/ x: x9 k& W5 Q9 ]1 U$ z" M front = 0;0 I" Z' ]0 |0 w2 }$ o
rear = -1;4 a! A/ @( r m
}, t# B0 z9 ?, U( K
return object;" T% }$ b3 |9 @& D) S9 i$ f
} ' V: T: o' H% B4 f; k% [9 D, l1 M6 B! b1 U6 U- D
@Override + m- K# J3 ]+ h; e public int getElementCount() {. J' C6 w. q9 S( y6 a# i _
return elementCount;+ H1 W% B, Z! K
} 8 A1 j! Q% A) c. S8 Q% f : I8 @) d' e; ~) S' J5 h4 F @Override( f; V9 D0 _& u$ o3 [# o8 E Q
public Object getFront() { 8 n' ?" }3 @7 D if (elementCount == 0) { 9 K; m T, t5 a7 {, e System.out.print("队头无元素"); E& A0 H* ~4 M8 S1 @$ D3 u return null; - \& _: w! o( |4 u" ? } % n) H( I/ v- j return element[front]; : j# @9 x" T& z* r3 y } , ^& a$ t; A- V7 _; X$ e( G% t/ i
@Override: ~! q: U- m) S0 B! @" |
public Object getRear() {, L! v+ B0 a' u" J& g
if (elementCount == 0) {. F# @8 [, u8 \3 s& w& N
System.out.print("队尾无元素"); & h0 X2 f8 j3 g. C, \0 ? K return null; , N# {' H+ n! }: j, c9 ?3 h& R }+ E) m2 |' m0 ]
return element[rear]; 3 F. ~* ^5 ^2 @0 t \2 m- h } 5 k) x' c& G' l( v' F1 N3 R9 |3 K) d9 L8 ^9 U8 c5 G& G+ `0 B
@Override* X4 r* L8 H- O9 }9 w
public void traverse() { ' Z+ v& D: j' J" d# V& R" O if (elementCount == 0) {4 M0 u: p4 M) ]8 B$ k
return; ( o" L9 W' G% ~) e2 h }: m/ s: E @1 c( R; T5 Y
for (int i = front; i <= rear; i++) { 0 O: v( k! B d- a) w, g$ u1 y System.out.print(element + ","); 2 |8 F" R5 G+ W$ Q! o/ f } % N3 l3 Q8 U1 ?+ Y+ v, F- O1 k System.out.println();3 R Z( a( b- s% V! N i4 p( i
}: W: i& c# D5 [' ~" M
}( I9 L* L7 K% c: _
! s% _0 H+ W+ q; P' Z4 d
* S; p/ I- o, [: y0 f9 N! T3、队列的测试 3 _, B( w! {: @. z4 e/ V+ F' @2 Lpublic class QueueTest { ; S% s. J! T* W4 Z, F. B4 E public static void main(String[] args) {/ H$ n& r5 ]& a
Queue queue = new QueueImpl();. `' N. X! {0 E9 B/ G
( I) P& b- ?( [ //获取队列大小5 B2 J3 q) U$ j1 E
System.out.println("队列中最大可放置元素:" + queue.getMaxSize()); k/ k! ~* f) K; w' G. F
" O" }* K% @9 z2 W9 v0 \ //第一次入队列:压入1-15 ) I. L. V3 K' q( \ for (int i = 0; i < 16; i++) { $ X7 N* l0 b1 Z8 m% J) @ queue.push(i); - A+ w" B. T! s' g8 f3 ]; V F } , \8 o* F. e' g9 c+ q, m. w+ E System.out.println("第一次入队后元素个数为:" + queue.getElementCount()); K/ E$ F9 \7 W1 q7 N$ Z! P4 v queue.traverse(); 4 W" N1 F- M' {) y" B1 j3 b7 V, K+ W System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear());) j: d t+ B; ^0 W
6 q) D8 v& X$ G/ p! ~6 @- W
//第一次出队:取出0-15 - X I) i1 v. v+ f+ f, a9 T for (int i = 0; i < 16; i++) { ( t/ C' V6 ]$ G1 A% O | queue.pull(); ! l: _* W7 g* H9 C+ x) F* R* l3 ]0 J } 5 s& o$ \: j5 c9 c6 w9 S5 m7 c System.out.println("第一次出队后元素个数为:" + queue.getElementCount()); 5 ^5 t j2 b) `4 u: n queue.traverse(); 3 L7 ^1 X- K. _/ X) O4 o9 o4 O System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear()); : X2 }/ K* g" j) o1 M; Q- s0 N# f. r, Z8 P
: u3 ~" O4 D" h$ j //第二次入队列:压入16,31 6 _3 N' k8 r4 K X9 w$ T for (int i = 16; i < 32; i++) { 0 B5 ~, c# z9 {# {5 n! p8 I queue.push(i);: ~8 D. h& S! F, Z. P
}- R7 C$ ?1 u$ S: K1 a, C. Q* O' Q9 M% W
System.out.println("第二次入队后元素个数为:" + queue.getElementCount());! P0 q/ i1 q1 Y) f- N4 p! f
queue.traverse();2 b. j) b- V6 v" z6 E
6 K! M* G! v3 T. N+ S$ Z$ d+ T
+ R3 `) q n; n! x) M //第二次出队:取出16-31 2 T b2 O/ l) c! m5 V2 d6 T& E0 H for (int i = 0; i < 16; i++) { 0 c9 E$ _5 T; k# \+ S# |7 w queue.pull();9 l0 P& d/ q; U
}* W0 l2 O8 K) h
System.out.println("第二次出队后元素个数为:" + queue.getElementCount()); $ [0 ^5 T* w7 @7 ]4 ~ queue.traverse();: t; }$ T4 L8 W* v
: L) a) F% B' S( S2 S- J5 @
//空队列出队报错 % g3 Z0 g; G _2 l4 i. D1 b queue.pull();% Q0 C& v5 y8 ?1 [4 x9 J% K
6 T& I0 X4 P0 k" ^: r8 p
}) I5 C# F5 K4 x- N& _
}/ n# [' T' n& x' p0 c8 \- P3 `+ T
/ t! o# K1 E, q5 s2 b
2 _4 K' ]0 e# A5 I* r" p