数据结构之线性结构

数组

import java.util.Arrays;

public class ArrayObj {

	private int[] elements;

	public ArrayObj() {
		this.elements = new int[0];
	}

	public int size() {
		return elements.length;
	}

	public void add(int element) {
		int[] arr = new int[this.size() + 1];
		for (int i = 0; i < elements.length; i++) {
			arr[i] = elements[i];
		}
		arr[this.size()] = element;
		elements = arr;
	}

	public void delete(int index) {
		indexOut(index);
		int[] arr = new int[this.size() - 1];
		for (int i = 0; i < this.size() - 1; i++) {
			if (i < index) {
				arr[i] = elements[i];
				continue;
			}
			arr[i] = elements[i + 1];
		}
		elements = arr;
	}

	public int get(int index) {
		indexOut(index);
		return elements[index];
	}

	private void indexOut(int index) {
		if (index >= this.size()) {
			throw new RuntimeException("索引越界:" + index);
		}
	}

	public void insert(int index, int element) {
		indexOut(index);
		int[] arr = new int[this.size() + 1];
		for (int i = 0; i < this.size() + 1; i++) {
			if (i < index) {
				arr[i] = elements[i];
				continue;
			}
			if (i == index) {
				continue;
			}
			arr[i] = elements[i - 1];
		}
		arr[index] = element;
		elements = arr;
	}

	@Override
	public String toString() {
		return Arrays.toString(elements);
	}

	// 测试
	public static void main(String[] args) {
		ArrayObj arr = new ArrayObj();
		arr.add(1);
		arr.add(2);
		arr.add(3);
		arr.add(4);
		arr.insert(0, 0);
		arr.insert(10, -1);
		arr.delete(1);
		System.out.println(arr);
	}
}
数组元素查找
  • 线性查找
public static int lineSearch(int target, int[] arr) {
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] == target) {
			return i;
		}
	}
	return -1;
}
  • 二分查找(二分查找的前提是有序数组)
// arr为有序数组
public static int binarySearch(int target, int[] arr) {
	int begin = 0;
	int end = arr.length - 1;
	int mid = (begin + end) / 2;
	while (true) {
		if (begin > end) {
			return -1;
		}
		if (arr[mid] == target) {
			return mid;
		} else {
			if (arr[mid] > target) {
				end = mid - 1;
				mid = (begin + end) / 2;
			} else {
				begin = mid + 1;
				mid = (begin + end) / 2;
			}
		}
	}
}

import java.util.Arrays;

public class Stack {

	private int[] elements;

	public Stack() {
		elements = new int[0];
	}

	public int size() {
		return elements.length;
	}
	
	public boolean isEmpty() {
		return this.size() == 0;
	}

	public void push(int element) {
		int[] arr = new int[this.size() + 1];
		for (int i = 0; i < this.size(); i++) {
			arr[i] = elements[i];
		}
		arr[this.size()] = element;
		elements = arr;
	}

	public int pop() {
		if (this.isEmpty()) {
			throw new RuntimeException("stack is empty");
		}
		int result = elements[this.size() - 1];
		int[] arr = new int[this.size() - 1];
		for (int i = 0; i < this.size() - 1; i++) {
			arr[i] = elements[i];
		}
		elements = arr;
		return result;
	}

	@Override
	public String toString() {
		return Arrays.toString(elements);
	}

	// 测试
	public static void main(String[] args) {
		Stack stack = new Stack();
		stack.push(1);
		stack.push(2);
		stack.push(3);
		System.out.println(stack);
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.size());
		System.out.println(stack.isEmpty());
	}
}

队列

import java.util.Arrays;

public class Queue {
	
	private int[] elements;

	public Queue() {
		elements = new int[0];
	}
	
	public int size() {
		return elements.length;
	}
	
	public boolean isEmpty() {
		return this.size() == 0;
	}
	
	public void enqueue(int element) {
		int[] arr = new int[this.size() + 1];
		for (int i = 0; i < this.size(); i++) {
			arr[i] = elements[i];
		}
		arr[this.size()] = element;
		elements = arr;
	}
	
	public int dequeue() {
		if (this.isEmpty()) {
			throw new RuntimeException("queue is empty");
		}
		int result = elements[0];
		int[] arr = new int[this.size() - 1];
		for (int i = 0; i < this.size() - 1; i++) {
			arr[i] = elements[i + 1];
		}
		elements = arr;
		return result;
	}

	@Override
	public String toString() {
		return Arrays.toString(elements);
	}
	
	public static void main(String[] args) {
		Queue queue = new Queue();
		queue.enqueue(1);
		queue.enqueue(2);
		queue.enqueue(3);
		System.out.println(queue);
		System.out.println(queue.dequeue());
		System.out.println(queue.dequeue());
		System.out.println(queue.dequeue());
		System.out.println(queue);
	}

}

链表

单链表
public class SinglyLinked {

	private Node header;

	public class Node {
		public int data;
		public Node nextNode;

		public Node(int data, Node nextNode) {
			this.data = data;
			this.nextNode = nextNode;
		}
	}

	public SinglyLinked() {
		header = new Node(0, null);
	}

	public void add(int element) {
		Node newNode = new Node(element, null);
		Node currentNode = header;
		while (currentNode.nextNode != null) {
			currentNode = currentNode.nextNode;
		}
		currentNode.nextNode = newNode;
	}

	public void delete(int element) {
		Node currentNode = header;
		while (currentNode.nextNode != null) {
			if (currentNode.nextNode.data == element) {
				currentNode.nextNode = currentNode.nextNode.nextNode;
				break;
			}
			currentNode = currentNode.nextNode;
		}
	}

	public int getIndex(int element) {
		int result = -1;
		Node currentNode = header;
		while (currentNode.nextNode != null) {
			result++;
			if (currentNode.nextNode.data == element) {
				return result;
			}
			currentNode = currentNode.nextNode;
		}
		// if no find this element
		if (result == this.size() - 1) {
			// reset result
			result = -1;
		}
		return result;
	}

	public int getElement(int index) {
		this.checkIndex(index);
		Node currentNode = header;
		for (int i = 0; i < index + 1; i++) {
			currentNode = currentNode.nextNode;
		}
		return currentNode.data;
	}
	
	private void checkIndex(int index) {
		if (index < 0 || index > this.size()) {
			throw new RuntimeException("索引越界:" + index);
		}
	}
	
	public int size() {
		int result = 0;
		Node currentNode = header;
		while (currentNode.nextNode != null) {
			result++;
			currentNode = currentNode.nextNode;
		}
		return result;
	}

	public boolean isEmpty() {
		return this.size() == 0;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("[ ");
		Node currentNode = header;
		while (currentNode.nextNode != null) {
			builder.append(currentNode.nextNode.data + ", ");
			currentNode = currentNode.nextNode;
		}
		builder.delete(builder.length() - 2, builder.length() - 1);
		builder.append("]");
		return builder.toString();
	}

	// 测试
	public static void main(String[] args) {
		SinglyLinked linked = new SinglyLinked();
		linked.add(1);
		linked.add(2);
		linked.add(3);
		linked.add(4);
		linked.add(5);
		linked.add(6);
		System.out.println(linked);
		System.out.println(linked.getElement(5));
		System.out.println(linked.getIndex(6));
	}

}
递归解决斐波那契数列

斐波那契数列:从第二个数开始,其余数为前两个数的和

比如斐波那契数列:1,1,2,3,5,8,13 …

// 斐波那契数列 1, 1, 2, 3, 5, 8, 13
// 参数 i 表示数列中的第几个数 (1 ~ n)
public static int febonacci(int i) {
	if (i == 1 || i == 2) {
		return 1;
	}
	return febonacci(i - 1) + febonacci(i - 2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值