Skip to content

Commit 3ac57e0

Browse files
committed
循环队列
1 parent 24e5294 commit 3ac57e0

File tree

1 file changed

+15
-6
lines changed
  • src/main/java/com/algorithm/study/demo/datastructure/queue

1 file changed

+15
-6
lines changed

src/main/java/com/algorithm/study/demo/datastructure/queue/SqQueue.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作。
66
队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头。队列的插入操作通常称作入队列,队列的删除操作通常称作出队列。
77
8-
循环队列可以有效的利用资源。如果使用普通数组实现队列时,如果不进行移动,随着数据的不断读写弹出插入,会出现假满队列的情况。例如不断向队列中添加元素,然后在弹出元素。这是弹出元素所空闲出来的空间并没有得到重复利用,这是就会出现数组尾部已经满了,但是头部还有空闲空间没有得到利用。
8+
循环队列可以有效的利用资源。如果使用普通数组实现队列时,如果不进行移动,随着数据的不断读写弹出插入,会出现假满队列的情况。例如不断向队列中添加元素,然后在弹出元素。这是弹出元素所空闲出来的空间并没有得到重复利用,
9+
这是就会出现数组尾部已经满了,但是头部还有空闲空间没有得到利用。
910
入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针
1011
1112
* Created by liuxun on 2017/6/22.
@@ -33,21 +34,20 @@ public int size(){
3334
* 循环队列入队操作
3435
* @param element
3536
*/
36-
public void add(E element){
37-
if (isFull()){
38-
throw new RuntimeException("队列已满,size:"+size());
39-
}
37+
public boolean add(E element){
38+
if ((rear+1)%maxsize==front) return false;//队列已满
4039
data[rear]=element;
4140
//逻辑上实现首尾相连,循环队列
4241
rear=(rear+1)%maxsize;
42+
return true;
4343
}
4444
/**
4545
* 循环队列出队操作,并清空头部
4646
* @return
4747
*/
4848
public Object poll(){
4949
if (rear==front && data[front]==null){
50-
throw new RuntimeException("空的队列");
50+
return null;
5151
}
5252
Object result=data[front];
5353
data[front]=null;
@@ -67,4 +67,13 @@ private boolean isFull(){
6767
return front == rear && data[front]!=null;
6868
}
6969

70+
public static void main(String[] args) {
71+
SqQueue queue=new SqQueue(8);
72+
for (int i=0;i<8;i++){
73+
queue.add(i);
74+
}
75+
System.out.println(queue.poll());
76+
System.out.println(queue.size());
77+
}
78+
7079
}

0 commit comments

Comments
 (0)