9 v: P, \0 V) S. l数据结构——栈(Stack)与队列(Queue)的手写实例; i2 X# A, V) c7 A( f, n0 z
. t8 M2 Y! | P7 T
[color=rgba(0, 0, 0, 0.74902)]文章目录
5 a8 `, x2 Z7 x: i: ]! g, W
一、 栈与队列的定义
二、 用数组实现栈 % P3 s- O' y+ r
1、栈的接口定义
2、栈的接口实现
3、栈的测试 5 D2 ]* E: A: } B7 {
三、 用数组实现队列 2 H# @: `/ D. S( Y' x5 \4 K
1、队列的接口定义
2、队列的接口实现
3、队列的测试- Y/ d5 a/ h6 M% [ Q2 V- z
~+ {' f {1 \- w' h% V+ E , W* W& S/ U2 w) m/ y+ O一、 栈与队列的定义$ Z0 B+ j+ c, h7 r% D
栈[Stack]:是一种限定仅在表尾进行插入和删除操作的线性表;即后进先出(LIFO-last in first out),最后插入的元素最先出来。 ( {4 r8 b5 n2 N) i, O! [# Y. ]2 M
: o+ K, m% b4 P G/ u/ ~, c protected Object[] element; & Y# Q6 l( h5 d) I3 U9 i( u/ w" F* H) T6 G3 @8 X
protected int elementCount; * f7 @% Z6 c' p' ^( h 8 [& l8 \, q* g( z' E$ x //队头 9 v! D4 _$ k8 ^. V8 _% w1 o private int front;) R/ ]7 [8 G, a0 T0 j; o
) Y, D Y! I1 \9 z: V6 i# V3 A
//队尾 + S7 b, h8 M( v; X o) G% T private int rear; * Y% W& j3 x& S, H - G8 I- |9 O: Q: g private int defaultSize = 16;' V: B4 L) E& l6 D
% E# d0 q8 S | private int maxSize; + c4 t) ^; \5 g# `9 k% ~# | . I& T! O7 { k! p, K" L) Q) I QueueImpl() { ( }; i9 o, X& A" Q# e+ L3 M; o element = new Object[defaultSize];2 D' m. A& q% o+ Q% E
maxSize = defaultSize;- O% b, z% x; Y" I" r
front = 0; " X1 B) c( R; y" \6 a rear = -1; 4 d& w8 U Z3 L, u; J5 y }# E' C" Z! ^% T- r0 C4 e
3 B6 Z! y* i! b Q
QueueImpl(int size) { 0 p3 ^# y" v/ {# B element = new Object[size];+ j1 |/ x F% b5 z# K' h' ^
maxSize = size; ( R/ Q; G8 Z- u5 ~: t+ J& R front = 0; 3 @8 O, Q, ~/ h4 ?" Z3 T" _ rear = -1;! l, v8 ~- C& ]) J, k1 J7 }
}) B- a, c: [. ]4 Q
* V3 z* y; \! }9 z) b! M6 q9 z @Override) B. X1 g8 g+ Y# D0 @& S
public int getMaxSize() { $ i! c/ U# m; U w9 J return maxSize; % F7 h7 B$ `% D- s6 n7 t! r7 K' m }6 j# G2 ~8 l5 M, m
) c2 t. O. V5 F2 M" E) O @Override, A& P) ?5 l5 W- b, P% L
public void push(Object object) { 3 Z" ~5 ^$ k& v! | //如果元素个数已经达到数组的最大个数,则进行扩容 1 a7 o( |$ J+ N) k# q if (elementCount == maxSize) {" e/ B; X0 Y! Q/ {! c& l1 Z& ^
throw new ArrayIndexOutOfBoundsException("队列已满,请先进行出队"); * w: t# m: U t6 s2 _( y0 V }! ^+ ^7 F7 m+ P8 ~5 L4 s! n
element[++rear] = object; 4 v7 g& R" |* j* t0 _6 R if (rear == element.length) { 4 I0 J# ]1 ~( \4 V; ^ rear = -1; : [; ?# G4 e/ m; K }, s6 w% Z9 j, k, @
elementCount++; ! ^& k/ O1 h+ J. f8 w$ u) | } 2 }0 m/ ?% j( l n3 Y+ ^9 l( q' Q4 b3 b; Y! w( k- Z
@Override4 l# W# l) @. G( \1 {4 q
public Object pull() { * j. B% V/ j7 H' j! u( f% c if (elementCount == 0) { ! @: ?9 p7 k F3 b! W# r% B" k throw new ArrayIndexOutOfBoundsException("队列中无元素");5 K- b1 r! X: ]0 O, R
} 1 n% y) J# ]. K0 z Object object = element[front];7 y7 s% n4 A, X! E2 u- i! _
element[front] = null; 1 K- V/ Y0 o5 B1 z front++; $ c# g& ?$ s. ^, G elementCount--; E( x+ S, O1 i8 e- y: b4 I //队列清空,队头队尾恢复初始值) t5 j+ `& o* B p' t/ z- r& a
if (elementCount == 0) { ; V' W" Y! M" {6 a, p5 @% C+ t front = 0;8 S, ?/ b) [: j! ~; n0 e8 M* W3 r
rear = -1; 6 ]) S {* l$ m$ P1 i/ j% N }: O4 _4 O7 u. f+ S/ f l4 k7 |
return object; % V+ r& k3 U4 U; N& e }3 ?# W4 N% T0 m6 d
2 p4 u( x5 n- f' {( d% G$ \8 e# o1 F, C
@Override , n+ K! w3 w& k1 ~" f; P6 b public int getElementCount() { 7 |. V+ o9 P* d( D6 | return elementCount;7 W: N, s/ s; N" r) J0 ]
}8 }5 A6 h7 q v2 U8 i8 m
8 G3 l! q: S6 F, j. {: l @Override 4 p$ R1 [, p: f* ?& X public Object getFront() {3 v$ z0 Q8 g1 y5 K) ^
if (elementCount == 0) {$ Z) @7 R% X e4 `5 Y! n9 J
System.out.print("队头无元素"); ~( P( f ?9 v* i* R
return null; $ E, B, |- Z9 z6 o$ l5 t } - C' u) H0 ^; u$ B& X return element[front];4 E3 o9 Q& ~/ i- U- y1 c
} 6 r9 G+ r( x O: T0 {$ @6 g8 ^ 6 S7 _) X: {5 k0 g @Override # Z/ M, C5 }4 A. A* f public Object getRear() { + A, L$ n/ P8 V, F7 ?6 e if (elementCount == 0) { * v0 U% h5 i& ^8 i System.out.print("队尾无元素");/ |$ k/ l1 R3 A/ n
return null; 4 P8 Y/ ], k' p, D3 {* p } S/ v; m5 {' l2 I1 L# k
return element[rear]; * x& T- Q3 S; { }: o4 ?4 n7 T- d2 k
- ~4 J5 |+ n5 z, r# U2 r V% T
@Override; w6 F* T) R- G$ b! R" m9 ^, h
public void traverse() {7 {) y4 N" @. Z o- R
if (elementCount == 0) {1 h& w" @' w7 o1 y, m% X# W0 y
return; 9 \) f5 L5 L! A: L" t R } ! v( \! u9 J( M( ^& c( w6 v1 @ for (int i = front; i <= rear; i++) { 4 x+ o5 q, _- `. u7 Z System.out.print(element + ",");# M: e3 D! k( [* n3 Q
} . e3 b2 U: Y4 W: x+ ?6 S System.out.println();6 ]. S* ?8 e( b' n8 {
}* W9 ~# a/ H) f( i' F) h, c4 J
}) I& k/ j" D# o& S- L( \
4 y- B% L, D0 l! J+ L [! k: h
3 ? g+ r4 ]3 `6 L/ c# D( ]# t 3、队列的测试 6 q; \6 I0 @8 y$ w0 epublic class QueueTest { $ n, v# v; {& [ public static void main(String[] args) {0 e6 Z2 b6 ^ y l# ~; `
Queue queue = new QueueImpl();3 `* Y. r, o3 G; G* |
" v$ v7 p* r7 t x) b
//获取队列大小 ( M9 f" }6 I2 }5 ~$ N/ Y System.out.println("队列中最大可放置元素:" + queue.getMaxSize()); 0 \* c9 s9 a8 ]. R' d: A; r3 j4 U; b G1 Y, @5 r Y
//第一次入队列:压入1-15 ' E |' g* p$ ? for (int i = 0; i < 16; i++) {+ l! C; s9 F" d* n& \' \6 H1 H
queue.push(i);. l% i$ u; p5 J% U+ \% H9 A5 L
}! q+ |( ?2 O8 h; u
System.out.println("第一次入队后元素个数为:" + queue.getElementCount()); + n, E( t/ g. t; h0 ^% i+ u4 O3 [ queue.traverse();) i# Y* q# B4 r8 A" ~
System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear()); " m: K, h2 x$ o3 a ( N9 a/ M9 P; n; p //第一次出队:取出0-15& ]/ \+ p a: j) R$ e
for (int i = 0; i < 16; i++) {' F0 L$ I8 D7 \5 O8 r9 W! ~
queue.pull(); , }8 `! A" N; ~& y7 d. Q3 [; C }" s* C6 v+ f- B0 m8 {/ G
System.out.println("第一次出队后元素个数为:" + queue.getElementCount());3 m* e& ]" t) \
queue.traverse(); ; Y1 L$ M1 d. y System.out.println("队头:"+queue.getFront()+" 队尾:"+queue.getRear()); 4 I: k) N: a" z ; P2 Q3 i! M- m3 |$ c 7 J" w/ S z, v4 R! `# b //第二次入队列:压入16,31 $ P. n5 M. W, |8 R$ F for (int i = 16; i < 32; i++) {+ v5 e# ?6 L& d/ _. r' M5 H' K+ v
queue.push(i); , E6 J3 `; q3 u4 ` }; l6 V: N2 g1 L2 g- r
System.out.println("第二次入队后元素个数为:" + queue.getElementCount()); $ X" v" ?6 i4 F: g, W queue.traverse(); - F. [/ H) A6 S+ A0 c! p" _/ F( z5 F( i3 ]6 J4 C# h, n0 V5 O
! p5 {& b8 e$ U) A% o+ X //第二次出队:取出16-31' P$ u Z: \% j% j" e/ P
for (int i = 0; i < 16; i++) {& g1 ^& H9 v S( S/ r0 y Z
queue.pull();8 }7 A2 X/ R" O! ?
}' d8 m0 x, K2 f6 u+ k6 X& e
System.out.println("第二次出队后元素个数为:" + queue.getElementCount()); * S/ e5 g7 L* D3 @! ?+ E7 E. z. U queue.traverse();/ `4 _: d, H. q) O# Q0 ^
! K, d# d/ G) a" n1 Q* s( p //空队列出队报错 - R0 U/ i) o2 ~8 a queue.pull(); 9 w/ X* b6 Y. M3 E8 n& b4 E! ]- K5 ?' _9 x! e" a
} 7 o2 a0 n; D, B: I" \4 b}2 e$ |5 r1 i! |+ `5 v+ r
' H! w8 {3 ^5 W9 D0 }3 b3 v- k
( q3 ? i0 x1 E! b6 |2 \. A
! K- J( P' ^ i8 p2 {- C r5 V/ Y
! P" I) E4 G! s
/ K6 r% g) M1 _5 z! A
0 J% l% [# J3 s0 x2 c; h% u7 F3 p2 b! d B* O+ M
* j D0 b% e1 `" n
( g9 M. n+ m5 [" V4 R& Q- ~- ?6 i- K6 l
* K: x' j- [" C$ P/ A S
) y. w# V( Q/ E+ D6 o& l7 q 0 ~$ i# p: ^. k' R/ C y0 j1 N9 M$ i' J, U6 v
: m( c( o! w$ K, t3 N' @————————————————3 Z! r& c& m' `8 T4 x+ A2 ~
版权声明:本文为CSDN博主「智慧zhuhuix」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 . K$ L+ ~3 |9 N$ S, C% k; l0 ~原文链接:https://blog.csdn.net/jpgzhu/article/details/105876785 / ?6 o2 b& r% x1 V. J2 k; d9 v# A) C/ G2 @7 K9 Z
2 \1 I, ]+ Z! L