package kunpu.arithmetic.datatype;
import java.util.Iterator;
/**
* @author zhen
* @Date 2018/4/11 10:12
*/
public class Bag<Item> implements Iterable<Item> {
private Node first;
private class Node{
Item item;
Node next;
}
public void add(Item item){
Node oldFirst = first;
first = new Node();
first.item = item;
first.next = oldFirst;
}
@Override
public Iterator<Item> iterator() {
return null;
}
private class ListIterator<Item> implements Iterator<Item>{
private Bag.Node current = first;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
Item item = (Item)current.item;
current = current.next;
return item;
}
}
}
package kunpu.arithmetic.datatype;
import java.util.Iterator;
/**
* 下压堆栈(链表实现)
*
* @author zhen
* @Date 2018/4/11 9:51
*/
public class Stack<Item> implements Iterable<Item> {
private Node first;
private int N;
public int size(){
return N;
}
public boolean isEmpty(){
return first == null;
}
public void push(Item item){
Node oldFirst = first;
first.item = item;
first.next = oldFirst;
N++;
}
public Item pop(){
Item item = first.item;
first = first.next;
N--;
return item;
}
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item>{
public boolean hasNext(){
return first.next != null;
}
public Item next(){
return first.next.getItem();
}
public void remove(){
}
}
private class Node{
Item item;
Node next;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
}
package kunpu.arithmetic.datatype;
import java.util.Iterator;
/**
* 下压栈
*
* @author zhen
* @Date 2018/4/11 9:22
*/
public class ResizingArraysStack<Item> implements Iterable<Item> {
private Item[] a = (Item[]) new Object[1];
private int N = 0;
public boolean isEmpty(){
return N ==0;
}
public int size(){
return N;
}
private void resize(int max){
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < N; i++){
temp[i] = a[i];
}
a = temp;
}
public void push(Item item){
if (N == a.length){
resize(2*a.length);
}
a[N++] = item;
}
public Item pop(){
Item item = a[--N];
a[N] = null;
if (N >0 && N== a.length/4){
resize(a.length/2);
}
return item;
}
@Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item>{
private int i = N;
public boolean hasNext(){
return i>0;
}
public Item next(){
return a[--i];
}
public void remove(){}
}
}
package kunpu.arithmetic.datatype;
import java.util.Iterator;
/**
* @author zhen
* @Date 2018/4/11 10:02
*/
public class Queue<Item> implements Iterable<Item> {
private Node first;
private Node last;
private int N;
public boolean isEmpty(){
return first == null;
}
public int size(){
return N;
}
public void enqueue(Item item){
Node oldLast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty()){
first = last;
}else{
oldLast.next = last;
}
N++;
}
public Item dequeue(){
Item item = first.item;
first = first.next;
if (isEmpty()){
last = null;
}
N--;
return item;
}
@Override
public Iterator<Item> iterator() {
return null;
}
private class Node{
Item item;
Node next;
}
}
package kunpu.arithmetic.datatype;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 使用无序链表实现符号表
*
* @author zhen
* @Date 2018/4/11 16:30
*/
public class SequentialSearchST<Key, Value> {
Set<Key> keySet = new HashSet<>();
int N = 0;
private class Node {
Key key;
Value value;
Node next;
Node(Key key, Value value, Node next){
this.key = key;
this.value = value;
this.next = next;
}
}
private Node first;
public void put(Key key, Value value){
for (Node x = first; x != null; x = x.next){
if (key.equals(x.key)){
x.value = value;
return;
}
}
first = new Node(key, value, first);
N++;
keySet.add(key);
}
public Value get(Key key){
for (Node x = first; x != null; x = x.next){
if (key.equals(x.key)){
return x.value;
}
}
return null;
}
public void delete(Key key){
for (Node x = first; x != null; x = x.next){
if (x.next == null){
return;
}
if (x.next.key.equals(key)){
x.next = x.next.next;
}
}
N--;
keySet.remove(key);
}
public boolean contains(Key key){
return get(key) != null;
}
public boolean isEmpty(){
return first == null;
}
public int size(){
return N;
}
public Iterable<Key> keys(){
return new Iterable<Key>() {
@Override
public Iterator<Key> iterator() {
return keySet.iterator();
}
};
}
}
package kunpu.arithmetic.datatype;
/**
* 二分查找 基于有序数组
* @author zhen
* @Date 2018/4/12 9:26
*/
public class BinarySearchST<Key extends Comparable<Key>, Value> {
private Key[] keys;
private Value[] values;
private int N;
public BinarySearchST(int capacity){
keys = (Key[])new Comparable[capacity];
values = (Value[])new Object[capacity];
}
public int size(){
return N;
}
public boolean isEmpty(){
return N == 0;
}
public Value get(Key key){
if (isEmpty()){
return null;
}
int i = rank(key);
if (i < N && keys[i].compareTo(key) == 0){
return values[i];
}else{
return null;
}
}
public void put(Key key, Value value){
int i = rank(key);
if ((i < N && keys[i].compareTo(key) == 0)){
values[i] = value;
return;
}
for (int j = N; j >i; j--){
keys[j] = keys[j-1];
values[j] = values[j-1];
keys[i] = key;
values[i] = value;
}
N++;
}
public void delete(Key key){
int i = rank(key);
if ((i < N && keys[i].compareTo(key) == 0)){
for (int j = i; j <N-1; j++){
keys[j] = keys[j+1];
values[j] = values[j+1];
}
}
}
public int rank(Key key){
int lo = 0, hi = N-1;
while (lo <= hi){
int mid = lo + (hi -lo)/2;
int cmp = key.compareTo(keys[mid]);
if (cmp < 0){
hi = mid -1;
}else if (cmp > 0){
lo = mid + 1;
}else{
return mid;
}
}
return lo;
}
public Key min(){
return keys[0];
}
public Key max(){
return keys[N-1];
}
public Key select(int k){
return keys[k];
}
public Key ceiling(Key key){
int i = rank(key);
return keys[i];
}
public boolean contains(Key key){
for (Key key1 : keys){
if (key1.compareTo(key) == 0){
return true;
}
}
return false;
}
public Iterable<Key> keys(Key lo, Key hi){
Queue<Key> q = new Queue<Key>();
for (int i = rank(lo); i < rank(hi); i++){
q.enqueue(keys[i]);
}
if (contains(hi)){
q.enqueue(keys[rank(hi)]);
}
return q;
}
}
package kunpu.arithmetic.datatype;
/**
* 基于二叉查找树的符号表
* @author zhen
* @Date 2018/4/12 14:50
*/
public class BST<Key extends Comparable<Key>, Value> {
private Node root;
private class Node{
private Key key;
private Value value;
private Node left, right;
private int N; //以该节点为根的子树种的节点总数
public Node(Key key, Value value, int n) {
this.key = key;
this.value = value;
N = n;
}
}
public int size(){
return size(root);
}
private int size(Node x){
if (x == null){
return 0;
}else{
return x.N;
}
}
private Value get(Key key){
return get(root, key) ;
}
private Value get(Node x, Key key){
if (x == null){
return null;
}
int cmp = key.compareTo(x.key);
if (cmp < 0){
return get(x.left, key);
}else if (cmp > 0){
return get(x.right, key);
}else{
return x.value;
}
}
public void put(Key key, Value value){
put(root, key, value);
}
private Node put(Node node, Key key, Value value){
if (node == null){
return new Node(key, value, 1);
}
int cmp = node.key.compareTo(key);
if (cmp < 0){
node.left = put(node.left, key, value);
}else if (cmp > 0){
node.right = put(node.right, key, value);
}else {
node.value = value;
}
node.N = size(node.left) + size(node.right) + 1;
return node;
}
public Key min(){
return min(root).key;
}
private Node min(Node x){
if (x.left == null) {
return x;
}
return min(x.left);
}
public Key floor(Key key){
Node x = floor(root, key);
if (x == null) {
return null;
}
return x.key;
}
private Node floor(Node x, Key key){
if (x == null){
return null;
}
int cmp = x.key.compareTo(key);
if (cmp == 0){
return x;
}else if (cmp < 0){
return floor(x.left, key);
}else{
Node t = floor(x.right, key);
if (t != null){
return t;
}else{
return x;
}
}
}
public Key select(int k){
return select(root, k).key;
}
private Node select(Node x, int k){
if (x == null) {
return null;
}
int t = size(x.left);
if (t > k){
return select(x.left, k);
}else if (t < k){
return select(x.right, k);
}else {
return x;
}
}
public int rank(Key key){
return rank(root, key);
}
private int rank(Node x, Key key){
if(x == null){
return 0;
}
int cmp = key.compareTo(x.key);
if (cmp < 0){
return rank(x.left, key);
}else if(cmp > 0){
return 1 + size(x.left) + rank(x.right, key);
}else {
return size(x.left);
}
}
/**
* 删除最小值
*/
public void deleteMin(){
root = deleteMin(root);
}
private Node deleteMin(Node x){
if (x.left == null){
return x.right;
}
x.left = deleteMin(x.left);
x.N = size(x.left) + size(x.right) + 1;
return x;
}
/**
* 删除
* @param key
*/
public void delete(Key key){
root = delete(root, key);
}
private Node delete(Node x, Key key){
if (x == null){
return null;
}
int cmp = key.compareTo(x.key);
if (cmp < 0){
x.left = delete(x.left, key);
}else if(cmp > 0){
x.right = delete(x.right, key);
}else{
if (x.right == null){
return x.left;
}
if (x.left == null){
return x.right;
}
Node t = x;
x = min(t.right);
x.right = deleteMin(t.right);
x.left = t.left;
}
x.N = size(x.left) + size(x.right) + 1;
return x;
}
public Key max(){
return max(root).key;
}
private Node max(Node x){
if (x.right == null){
return x;
}
return max(x.right);
}
public Iterable<Key> keys(){
return keys(min(),max());
}
public Iterable<Key> keys(Key lo, Key hi){
Queue<Key> queue = new Queue<Key>();
keys(root, queue, lo, hi);
return queue;
}
private void keys(Node x, Queue<Key> queue, Key lo, Key hi){
if (x == null){
return ;
}
int cmpLo = lo.compareTo(x.key);
int cmpHi = hi.compareTo(x.key);
if (cmpLo < 0){
keys(x.left, queue, lo, hi);
}
if (cmpLo <= 0 && cmpHi >= 0){
queue.enqueue(x.key);
}
if (cmpHi > 0){
keys(x.right, queue, lo, hi);
}
}
}
package kunpu.arithmetic.datatype;
/**
* 基于堆的优先队列
* 从大到小
* 自上而下的完全二叉树结构,数组实现。k,k/2 = parent, 2k = left, 2k+1=right
*
* @author zhen
* @Date 2018/4/10 16:30
*/
public class MaxPQ<Key extends Comparable<Key>>{
private Key[] pq; //基于堆的完全二叉树
private int N = 0; //存储于pq[1..N]中,pq[0]没有使用
public MaxPQ(int maxN){
pq = (Key[])new Comparable[maxN + 1];
}
public boolean isEmpty(){
return N ==0;
}
public int size(){
return N;
}
public void insert(Key v){
pq[++N] = v;
swim(N);
}
public Key delMax(){
Key max = pq[1]; //从根节点得到最大元素
exch(1, N--); //将其和最后一个节点交换
pq[N+1] = null; //防止越界
sink(1); //恢复堆的有序性
return max;
}
private void swim(int k){//上浮
while(k > 1 && less(k/2, k)){
exch(k/2, k);
k = k/2;
}
}
private void sink(int k){//下沉
while (2*k <= N){
int j = 2*k;
if (j < N && less(j, j+1)){
j++;
}
if (!less(k, j)){
break;
}
exch(k, j);
k = j;
}
}
private void exch(int a, int b){
Key temp = pq[a];
pq[a] = pq[b];
pq[b] = temp;
}
private boolean less(int i, int j){
return pq[i].compareTo(pq[j]) < 0;
}
}