線性表包括數(shù)組,鏈表(單鏈表筐摘,雙向鏈表卒茬,循環(huán)鏈表,雙向循環(huán)鏈表咖熟,靜態(tài)鏈表)圃酵,棧(順序棧,鏈式棧)馍管,隊列(普通隊列郭赐,雙端隊列,阻塞隊列确沸,并發(fā)隊列捌锭,阻塞并發(fā)隊列)。
棧
棧是限定僅在表位進行插入和刪除操作的線性表罗捎,棧只有兩種操作:入棧和出棧观谦,LIFO (后進先出)。
椊安耍可以用數(shù)組來實現(xiàn)(順序棧)豁状, 也可以用鏈表實現(xiàn)(鏈式棧)捉偏。
入棧和出棧的代碼演示
package dataStructures;
public class Stack {
private String[] items;
private int size;
private int count;
public Stack(int size) {
this.size = size;
this.count = 0;
items = new String[size];
}
public boolean push(String item) {
if (count == size) return false;
items[count] = item;
++count;
return true;
}
public String pop() {
if (count > 0) {
String item = items[count];
--count;
return item;
}
return null;
}
}
隊列
隊列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表替蔬。隊列是一種先進先出(FIFO)的線性表告私,允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭承桥。隊列也只有兩種操作入隊(enqueue)和出隊(dequeue)。隊列跟棧一樣根悼,也可以由數(shù)組或鏈表實現(xiàn)凶异,分別稱為順序隊列和鏈式隊列
package dataStructures;
public class ArrayQueue {
private String[] items;
private int size = 0;
private int head = 0;
private int tail = 0;
public ArrayQueue(int size) {
this.size = size;
items = new String[size];
}
public boolean enqueue(String item) {
if (tail == size) {//tail已經(jīng)超出數(shù)組空間了
if (head == 0) return false;//隊列已滿
for (int i = head; i < tail; ++i) {
items[i - head] = items[i];
}
tail -= head;
head = 0;
}
items[tail] = item;
++tail;
return true;
}
public String dequeue() {
if (head == tail) return null;
String item = items[head];
++head;
return item;
}
}
上述隊列會發(fā)生數(shù)據(jù)搬移操作,所以多少會影響性能挤巡。
下面介紹循環(huán)隊列剩彬,所謂循環(huán)隊列,顧名思義矿卑,就是首尾相接的隊列喉恋。
當 head = tail 的時候說明隊列是空的,當 head 與 tail 相差為1是說明隊列已滿母廷,但對于循環(huán)隊列來說 head 有時候會比 tail 大轻黑,有時會比 tail 小,所以我們用取模的形式(tail+1)%QueueSize = head 這是說明隊列已滿琴昆,由于此時tail還沒有插入值氓鄙,所有對于循環(huán)隊列來說,總有一個是空的
package dataStructures;
//循環(huán)隊列
public class CircularQueue {
private String items[];
private int head = 0;
private int tail = 0;
private int queueSize = 0;
public CircularQueue(int size) {
this.queueSize = size;
items = new String[size];
}
private boolean enqueue(String item) {
//隊列已滿
if ((tail + 1) % queueSize == head) return false;
items[tail] = item;
tail = (tail + 1) % queueSize;
return true;
}
private String dequeue() {
//隊列為空
if (head == tail) return null;
String value = items[head];
head = (head + 1) % queueSize;
return value;
}
}