Data structure basics - Java Implementation
- Stack & Queue Implementations
-
FixedCapacityQueue
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
FixedCapacityQueue<T> {
private
int
size;
private
int
head;
private
int
tail;
private
T[] items;
FixedCapacityQueue(
int
cap) {
this
.size = cap;
this
.head =
this
.tail =
0
;
this
.items = (T[])
new
Object[cap];
}
private
void
enqueue(T item)
throws
Exception {
if
((
this
.tail +
1
) %
this
.size ==
this
.head) {
throw
new
Exception();
}
this
.items[
this
.tail] = item;
this
.tail = (
this
.tail +
1
) %
this
.size;
}
private
T dequeue()
throws
Exception {
if
(
this
.head >=
this
.size ||
this
.head ==
this
.tail) {
throw
new
Exception();
}
T node =
this
.items[
this
.head];
this
.head = (
this
.head +
1
) %
this
.size;
return
node;
}
public
static
void
main(String[] args)
throws
Exception {
FixedCapacityQueue<String> queue =
new
FixedCapacityQueue<>(
4
);
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
};
for
(String s :
tstCases) {
queue.enqueue(s);
}
queue.dequeue();
queue.enqueue(
"Bob"
);
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = queue.dequeue();
outputVerified[
1
] = queue.dequeue();
outputVerified[
2
] = queue.dequeue();
tstCases =
new
String[]{
"Tina"
,
"Alex"
,
"Bob"
};
for
(
int
i =
0
; i <
3
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- FixedCapacityStack
-
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
FixedCapacityStack<T> {
private
int
size;
private
int
index;
private
T[] items;
FixedCapacityStack(
int
cap) {
this
.size = cap;
this
.index =
0
;
this
.items = (T[])
new
Object[cap];
}
private
void
push(T item)
throws
Exception {
if
(
this
.index ==
this
.size) {
throw
new
Exception();
}
this
.items[
this
.index++] = item;
}
private
T pop()
throws
Exception {
if
(
this
.index ==
0
) {
throw
new
Exception();
}
return
this
.items[--
this
.index];
}
public
static
void
main(String[] args)
throws
Exception {
FixedCapacityStack<String> stack =
new
FixedCapacityStack<>(
3
);
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
};
for
(String s :
tstCases) {
stack.push(s);
}
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = stack.pop();
outputVerified[
1
] = stack.pop();
outputVerified[
2
] = stack.pop();
for
(
int
i =
0
; i <
3
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[
2
- i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- ResizingArrayQueue
-
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
import
static
java.lang.Math.min;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
ResizingArrayQueue<T> {
private
int
size;
private
int
head;
private
int
tail;
private
T[] items;
ResizingArrayQueue(
int
cap) {
this
.size = cap;
this
.head =
this
.tail =
0
;
this
.items = (T[])
new
Object[cap];
}
private
void
resize(
int
newCapacity) {
T[] newItems = (T[])
new
Object[newCapacity];
for
(
int
i =
0
; i < min(
this
.size, newCapacity); ++i) {
newItems[i] =
this
.items[i];
}
this
.size = newCapacity;
this
.items = newItems;
}
private
void
enqueue(T item)
throws
Exception {
if
(
this
.tail ==
this
.size) {
resize(
this
.size *
2
);
}
this
.items[
this
.tail++] = item;
}
private
T dequeue()
throws
Exception {
if
(
this
.head >=
this
.size ||
this
.head ==
this
.tail) {
throw
new
Exception();
}
int
length =
this
.tail -
this
.head;
if
(length *
4
<=
this
.size) {
for
(
int
i =
this
.head; i <
this
.tail; ++i) {
this
.items[i -
this
.head] =
this
.items[i];
}
resize(
this
.size /
2
);
this
.tail =
this
.tail -
this
.head;
this
.head =
0
;
}
return
this
.items[
this
.head++];
}
public
static
void
main(String[] args)
throws
Exception {
ResizingArrayQueue<String> queue =
new
ResizingArrayQueue<>(
3
);
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
,
"Lilith"
,
"Bob"
};
for
(String s :
tstCases) {
queue.enqueue(s);
}
queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue();
tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
,
"Lilith"
,
"Bob"
};
for
(String s :
tstCases) {
queue.enqueue(s);
}
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = queue.dequeue();
outputVerified[
1
] = queue.dequeue();
outputVerified[
2
] = queue.dequeue();
outputVerified[
3
] = queue.dequeue();
outputVerified[
4
] = queue.dequeue();
for
(
int
i =
0
; i <
5
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- ResizingArrayStack
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
import
static
java.lang.Math.min;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
ResizingArrayStack<T> {
private
int
size;
private
int
index;
private
T[] items;
ResizingArrayStack(
int
cap) {
this
.size = cap;
this
.index =
0
;
this
.items = (T[])
new
Object[cap];
}
private
void
resize(
int
newCapacity) {
T[] newItems = (T[])
new
Object[newCapacity];
for
(
int
i =
0
; i < min(
this
.size, newCapacity); ++i) {
newItems[i] =
this
.items[i];
}
this
.size = newCapacity;
this
.items = newItems;
}
private
void
push(T item)
throws
Exception {
if
(
this
.index ==
this
.size) {
resize(
this
.size *
2
);
}
this
.items[
this
.index++] = item;
}
private
T pop()
throws
Exception {
if
(
this
.index ==
0
) {
throw
new
Exception();
}
if
(
this
.index *
4
<=
this
.size) {
resize(
this
.size /
2
);
}
return
this
.items[--
this
.index];
}
public
static
void
main(String[] args)
throws
Exception {
ResizingArrayStack<String> stack =
new
ResizingArrayStack<>(
5
);
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
,
"Bob"
,
"Lilith"
};
for
(String s :
tstCases) {
stack.push(s);
}
stack.pop();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
,
"Bob"
,
"Lilith"
};
for
(String s :
tstCases) {
stack.push(s);
}
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = stack.pop();
outputVerified[
1
] = stack.pop();
outputVerified[
2
] = stack.pop();
outputVerified[
3
] = stack.pop();
outputVerified[
4
] = stack.pop();
for
(
int
i =
0
; i <
5
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[
4
- i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- LinkedListQueue
-
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
LinkedListQueue<T> {
private
class
Node{
private
T item;
private
Node next;
Node(T item, Node next) {
this
.item = item;
this
.next = next;
}
}
private
Node head;
private
Node tail;
LinkedListQueue() {
this
.head =
this
.tail =
null
;
}
private
void
enqueue(T item) {
Node newNode =
new
Node(item,
null
);
if
(
this
.tail ==
null
) {
this
.head =
this
.tail = newNode;
}
else
{
this
.tail.next = newNode;
this
.tail = newNode;
}
}
private
T dequeue()
throws
Exception {
if
(
this
.head ==
null
) {
throw
new
Exception();
}
Node retNode =
this
.head;
this
.head =
this
.head.next;
return
retNode.item;
}
public
static
void
main(String[] args)
throws
Exception {
LinkedListQueue<String> queue =
new
LinkedListQueue<>();
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
};
for
(String s :
tstCases) {
queue.enqueue(s);
}
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = queue.dequeue();
outputVerified[
1
] = queue.dequeue();
outputVerified[
2
] = queue.dequeue();
for
(
int
i =
0
; i <
3
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- LinkedListStack
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
package
cn.edu.tsinghua.stat.mid_term;
import
java.util.Objects;
/**
* Created by shuaiyi on 04/11/2017.
*/
public
class
LinkedListStack<T> {
private
class
Node{
private
T item;
private
Node next;
Node(T item, Node next) {
this
.item = item;
this
.next = next;
}
}
private
Node head;
private
void
push(T item) {
this
.head =
new
Node(item,
this
.head);
}
private
T pop() {
T value =
this
.head.item;
this
.head =
this
.head.next;
return
value;
}
public
static
void
main(String[] args) {
LinkedListStack<String> stack =
new
LinkedListStack<>();
String[] tstCases =
new
String[]{
"Lydia"
,
"Tina"
,
"Alex"
};
for
(String s :
tstCases) {
stack.push(s);
}
String[] outputVerified =
new
String[tstCases.length];
outputVerified[
0
] = stack.pop();
outputVerified[
1
] = stack.pop();
outputVerified[
2
] = stack.pop();
for
(
int
i =
0
; i <
3
; ++i) {
if
(Objects.equals(outputVerified[i], tstCases[
2
- i])) {
System.out.println(
"Test "
+ i +
"#: succeeded"
);
}
else
{
System.out.println(
"Test "
+ i +
"#: failed"
);
}
}
}
}
-
- Basic Sorting Algorithm Implementations
package cn.edu.tsinghua.stat.mid_term; /** * Created by shuaiyi on 04/11/2017. */ public class InsertionSort { private void swap(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private void sort(Comparable[] a) { for (int i = 1; i < a.length; ++i) { for (int j = i; j > 0 && less(a[j], a[j - 1]); --j) { swap(a, j, j - 1); } } } public static void main(String[] args) { InsertionSort insertionSort = new InsertionSort(); String[] a = new String[]{"54", "23", "98", "67", "12", "32", "23", "55", "98", "94"}; insertionSort.sort(a); for (String item : a) { System.out.print(item + ", "); } } }
-
-
package cn.edu.tsinghua.stat.mid_term; import static java.lang.Math.min; /** * Created by shuaiyi on 04/11/2017. */ public class SelectionSort { private void swap(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } private void sort(Comparable[] a) { int i, j; for (i = 0; i < a.length; ++i) { int curMinIndex = i; for (j = i + 1; j < a.length; ++j) { if (less(a[j], a[curMinIndex])) { curMinIndex = j; } } if (curMinIndex != i) { swap(a, i, curMinIndex); } } } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } public static void main(String[] args) { SelectionSort selectionSort = new SelectionSort(); String[] a = new String[]{"54", "23", "98", "67", "12", "32", "23", "55", "98", "94"}; selectionSort.sort(a); for (String item : a) { System.out.print(item + ", "); } } }
-
package cn.edu.tsinghua.stat.mid_term; /** * Created by shuaiyi on 04/11/2017. */ public class MergeSort { private Comparable[] aux; public MergeSort(int cap) { aux = new Comparable[cap]; } private void swap(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private void sort(Comparable[] a) { sort(a, 0, a.length - 1); } private void sort(Comparable[] a, int low, int high) { if (low >= high) { return; } int mid = (low + high) / 2; sort(a, low, mid); sort(a, mid + 1, high); merge(a, low, high); } private void merge(Comparable[] a, int low, int high) { int mid = (low + high) / 2; int lft_index = low; int right_index = mid + 1; for (int k = low; k <= high; ++k) { this.aux[k] = a[k]; } int flag = lft_index; while(lft_index <= mid && right_index <= high) { if (less(this.aux[lft_index], this.aux[right_index])) { a[flag++] = this.aux[lft_index++]; } else { a[flag++] = this.aux[right_index++]; } } while(lft_index <= mid) { a[flag++] = this.aux[lft_index++]; } while(right_index <= high) { a[flag++] = this.aux[right_index++]; } } private void officialMerge(Comparable[] a, int low, int high) { int mid = (low + high) / 2; int i = low; int j = mid + 1; for (int k = low; k <= high; ++k) { this.aux[k] = a[k]; } for (int k = low; k <= high; ++k) { if (i > mid) { a[k] = this.aux[j++]; } else if (j > high) { a[k] = this.aux[i++]; } else if (less(this.aux[j], this.aux[i])) { a[k] = this.aux[j++]; } else { a[k] = this.aux[i++]; } } } public static void main(String[] args) { String[] a = new String[]{"8", "3", "1", "4", "6", "5", "9", "7", "2", "0"}; MergeSort mergeSort = new MergeSort(a.length); mergeSort.sort(a); for (String item : a) { System.out.print(item + ", "); } } }
-
package cn.edu.tsinghua.stat.mid_term; /** * Created by shuaiyi on 04/11/2017. */ public class QuickSort { private void swap(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private void sort(Comparable[] a) { sort(a, 0, a.length - 1); } private void sort(Comparable[] a, int lft, int rht) { if (lft >= rht) { return; } int mid = partition(a, lft, rht); sort(a, lft, mid); sort(a, mid + 1, rht); } private int partition(Comparable[] a, int lft, int rht) { int mid = (lft + rht) / 2; int cnt = 0; for (int k = lft; k <= rht; ++k) { if (less(a[k], a[mid])) { ++cnt; } } if (cnt + lft != mid) { swap(a, cnt + lft, mid); } mid = cnt + lft; int less_index = lft; int more_index = mid + 1; while (less_index < mid && more_index <= rht) { if (less(a[less_index], a[mid])) { less_index++; } else{ swap(a, less_index, more_index); more_index++; } } return mid; } private int officalPartition(Comparable[] a, int lo, int hi) { int i = lo, j = hi + 1; Comparable v = a[lo]; while (true) { while (less(a[++i], v)) if (i == hi) break; while (less(v, a[--j])) if (j == lo) break; if (i >= j) break; swap(a, i, j); } swap(a, lo, j); return j; } public static void main(String[] args) { String[] a = new String[]{"8", "3", "1", "4", "6", "5", "9", "7", "2", "0"}; QuickSort quickSort = new QuickSort(); quickSort.sort(a); for (String item : a) { System.out.print(item + ", "); } } }
-
package cn.edu.tsinghua.stat.mid_term; /** * Created by shuaiyi on 04/11/2017. */ public class MaxPQ<T extends Comparable<T>> { private int N = 0; private T[] pq; MaxPQ(int cap) { this.pq = (T[]) new Comparable[cap + 1]; } public void insert(T item) { this.pq[++N] = item; swim(N); } public T delMax() { T maxNode = this.pq[1]; swap(this.pq, 1, N); this.pq[N] = null; N--; sink(1); return maxNode; } public void swap(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } public static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } public void swim(int k) { while(k > 1 && less(this.pq[k / 2], this.pq[k])) { swap(this.pq, k/2, k); k /= 2; } } public void sink(int k) { while(k * 2 <= N) { int child = k * 2; if (child + 1 <= N && less(this.pq[child], this.pq[child + 1])) { child = k * 2 + 1; } if (less(this.pq[k], this.pq[child])) { swap(this.pq, k, child); k = child; } else { break; } } } public void officialSink(int k) { while(2 * k <=N) { int j = 2 * k; if (j < N && less(pq[j], pq[j + 1])) j++; if (!less(pq[k], pq[j])) break; swap(pq, k, j); k = j; } } public String[] sort() { String[] res = new String[this.N]; int flag = 0; while (N > 0) { res[flag++] = (String)delMax(); } return res; } public static void main(String[] args) { String[] a = new String[]{"8", "3", "1", "4", "6", "5", "9", "7", "2", "0"}; MaxPQ<String> maxPQ = new MaxPQ<>(a.length); for (String s : a) { maxPQ.insert(s); } String[]b = maxPQ.sort(); for (String item : b) { System.out.print(item + ", "); } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步