数据结构

2020-05-22  本文已影响0人  不羁者的璀璨星空丶

数据结构

1. 栈

实现一个栈:

代码实现:

class Stack():
    def __init__(self):
        self.items = []
    def push(self,item):
        """添加一个元素item到栈顶"""
        self.items.append(item)
    def pop(self):
        """从栈顶删除一个元素并返回"""
        return self.items.pop()
    def peek(self):
        """获取栈顶的元素"""
        return self.items[-1]
    def isEmpty(self):
        """判断栈是否为空"""
        return self.items == []
    def size(self):
        """获取栈的元素个数"""
        return len(self.items)

2. 队列

实现一个队列:

代码实现:

class Queue():
    def __init__(self):
        self.items = []
    def enqueue(self,item):
        """向对尾插入一个元素item"""
        self.items.insert(0,item)
    def dequeue(self):
        """从队尾删除一个元素"""
        return self.items.pop()
    def isEmpty(self):
        """判断队列是否为空"""
        return self.items == []
    def size(self):
        """获取队列的长度"""
        return len(self.items)

3. 链表

实现一个链表:

代码实现:

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None

class Link():
    def __init__(self):
        self._head = None

    def add(self,item):
        """新增一个链表节点"""
        node = Node(item)
        if self._head == None:
            self._head = node
            return
        node.next = self._head
        self._head = node

    def append(self,item):
        """链表尾部添加节点item"""
        node = Node(item)
        cur = self._head
        pre = None 
        while cur:
            pre = cur
            cur = cur.next
        pre.next = node

    def travel(self):
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next

    def search(item):
        isFind = False
        cur = self._head
        while cur:
            if cur.item == item:
                isFind = True
        return isFind

    def length(self):
        cur = self._head
        num = 0
        while cur:
            num += 1
            cur = cur.next
        return num
    def isEmpty(self):
        return self._head.item == None

    def insert(self,item,index):
        """向指定的位置index,插入节点item"""
        node = Node(item)
        cur = self._head
        point = 0
        if index <= 0:
            self.add(item)
        elif index >= self.length():
            self.append(item)
        else:
            while cur:
                pre = cur
                cur = cur.next
                if point == index - 1:
                    node.next = cur
                    pre.next = node
                point += 1
    
    def remove(self,item):
        cur = self._head
        pre = None
        if self.search(item):
            if cur.item == item:
                self._head = cur.next
                return
            while cur:
                pre = cur
                cur = cur.next
                if cur.item == item:
                    pre.next = cur.next
                    cur.next = None
                    break


link = Link()
link.add(1)
link.add(2)
link.add(3)
link.add(4)
link.add(5)
link.append(6)
link.travel()
print(link.search(6))
print(link.isEmpty())
print(link.length())
link.insert(200,4)
print(link.search(200))
link.travel()
print("===========")
link.remove(200)
link.travel()

3. 二叉树

定义一个二叉树:

class Node():
    def __init__(self,item):
        self.item = item
        self.left = None
        self.right = None

class Tree():
    def __init__(self):
        self.root = None
    def insert(self,item):
        node = Node(item)
        if self.root == None:
            self.root = node
            return
        cur = self.root
        node_list = [cur]
        while True:
            node_pop = node_list.pop(0)
            if node_pop.left == None:
                node_pop.left = node
                break
            else:
                node_list.append(node_pop.left)
            if node_pop.right== None:
                node_pop.right= node
                break
            else:
                node_list.append(node_pop.right)
    def travel(self):
        cur = self.root
        node_list = [cur]
        while node_list:
            node_pop = node_list.pop(0)
            print(node_pop.item)
            if node_pop.left != None:
                node_list.append(node_pop.left)
            if node_pop.right != None:
                node_list.append(node_pop.right)

t = Tree()
t.insert(1)
t.insert(2)
t.insert(3)
t.insert(4)
t.insert(5)

t.travel()

查找算法

1. 顺序查找

def search(alist,item):
    isFind = False
    pos = 0
    while True:
        if alist[pos] == item:
            isFind = True
            break
        else:
            pos += 1
            if pos == len(alist):
                break
    return isFind
alist = [1,2,3,4,5,6,7,8,9]
print(search(alist,5))


2. 二分查找

def search(alist,item):
    isFind = False
    left = 0
    right = len(alist) - 1
    while left <= right:
        mid = (left + right) // 2
        if item < alist[mid]:
            right = mid - 1
        elif item > alist[mid]:
            left = mid + 1
        else:
            isFind = True
            break
    return isFind

alist = [1,2,3,4,5,6,7,8,9]
print(search(alist,5))

排序算法

1. 冒泡排序

def sort(item):
    for i in range(len(item)):
        for j in range(len(item)-i-1):
            if item[j] > item[j+1]:
                item[j],item[j+1] = item[j+1],item[j]
    return item

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))
                

2. 选择排序

def sort(item):
    for j in range(len(item)-1):
        max = 0
        for i in range(1,len(item)-j):
            if item[max] < item[i]:
                max = i
        item[max],item[len(item)-j-1] = item[len(item)-j-1],item[max]
    return item

            
alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

3. 插入排序

def sort(alist):
    for i in range(len(alist)):
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i -= 1
            else:
                break
    return alist

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

4. 希尔排序

def sort(alist):
    gap = len(alist) // 2
    while gap > 0:
        for i in range(len(alist)):
            while i > 0:
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1] = alist[i-1],alist[i]
                    i -= 1
                else:
                    break
        gap //= 2
    return alist

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

5. 快速排序

def sort(alist,start,end):
    low= start
    high= end

    if low > high:
        return

    mid = alist[low]
    while low < high:
        while low < high:
            if mid > alist[high]:
                alist[low] = alist[high]
                break
            else:
                high -= 1
        while low < high:
            if mid < alist[low]:
                alist[high] = alist[low]
                break
            else:
                low += 1
        if low == high:
            alist[low] = mid
            break
    
    sort(alist,start,high-1)
    sort(alist,low+1,end)
    
    return alist

alist = [5,7,8,3,2,1,4,6,9]
sort(alist,0,len(alist)-1)
                
上一篇 下一篇

猜你喜欢

热点阅读