python数据结构

1、栈(后进先出)

代码:

# -*- coding: cp936 -*-

class Stack:
    """模拟栈"""
    def __init__(self):
        self.items=[];
    def isEmpty(self):
        return len(self.items)==0;
    def push(self,item):
        self.items.append(item);
    def pop(self):
        return self.items.pop();
    def peek(self):
        if not self.isEmpty():
            return self.items[len(self.items)-1]
    def size(self):
        return len(self.items);
s=Stack();
print(s.isEmpty());
s.push('DataA');
s.push('DataB');
print(s.peek());
s.push('DataC');
print(s.size());
print(s.isEmpty());
s.push('DataD');
print(s.pop());
print(s.pop());
print(s.size());
实验结果为:

2、队列(先进先出)

实验代码:

class Queue(object):
    def __init__(self):
        self.queue=[];
    def isEmpty(self):
        return self.queue==[];
    def enqueue(self,item):
        self.queue.append(item);
    def dequeue(self):
        if self.queue!=[]:
            return self.queue.pop(0);
        else:
            return None
    def head(self):
        if self.queue!=[]:
            return self.queue[0];
        else:
            return None
    def tail(self):
        if self.queue!=[]:
            return self.queue[-1];
        else:
            return None
    def length(self):
        return len(self.queue)
q=Queue();
print(q.isEmpty());
q.enqueue('DataA');
q.enqueue('DataB');
print(q.head());
print(q.tail());
q.enqueue('DataC');
print(q.length());
print(q.isEmpty());
q.enqueue('DataD');
print(q.dequeue());
print(q.dequeue());
print(q.length());

实验结果:


问题:为什么tail()函数中self.queue[-1]下标为-1 呐?


3、树(非线性的数据结构)(具有非常高的层次性,在很大程度上节约存储空间)

二叉树:要么是空树,要么有左右两个子树。是一个有序树,即使只有一个子树,也要区分该子树是左子树还是右子树。二叉树有两种存储方式,一种是顺序存储,一种是链式存储。顺序存储中采用一维数组的存储方式;链式存储,采用链表的存储方式。在链式存储中,树节点包含数据域、左子链域、右子链域。

完全二叉树:指除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点。

满二叉树:是一种特殊的完全二叉树,指除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。

遍历二叉树的思想:要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。

实验代码:

# -*- coding: cp936 -*-
class Node(object):
    def __init__(self,data=-1,lchild=None,rchild=None):
        self.data=data;
        self.lchild=lchild;
        self.rchild=rchild;
class BinaryTree(object):
    def __init__(self):
        self.root=Node();
    def add(self,data):
        node=Node(data);
        if self.isEmpty():
            self.root=node;
        else:
            tree_node=self.root;
            queue=[];
            queue.append(self.root);
            while queue:
                tree_node=queue.pop(0)
                if tree_node.lchild==None:
                    tree_node.lchild=node
                    return;
                elif tree_node.rchild==None:
                    tree_node.rchild=node;
                    return;
                else:
                    queue.append(tree_node.lchild);
                    queue.append(tree_node.rchild);
    def pre_order(self,start):
        node=start;
        if node==None:
            return;
        print node.data;
        if node.lchild==None and node.rchild==None:
            return;
        self.pre_order(node.lchild);
        self.pre_order(node.rchild);
    def in_order(self,start):
        node=start;
        if node==None:
            return;
        self.in_order(node.lchild);
        print node.data;
        self.in_order(node.rchild);
    def post_order(self,start):
        node=start;
        if node==None:
            return;
        self.post_order(node.lchild);
        self.post_order(node.rchild);
        print node.data;
    def isEmpty(self):
        return True if self.root.data==-1 else False;
    def length(self):
        return len(self.queue);
if __name__=='__main__':
    arr=[];
    for i in range(10):
        arr.append(i);
    print arr;
    tree=BinaryTree();
    for i in arr:
        tree.add(i);
    print 'pre order:';
    tree.pre_order(tree.root);
    print '\n in_order:'
    tree.in_order(tree.root);
    print '\npost_order:'
    tree.post_order(tree.root);

实验结果为:


分析图片:


4、链表

实验代码:

# -*- coding: cp936 -*-
class Node():
    __slots__=['_item','_next'];#限定实例属性
    def __init__(self,item):
        self._item=item;
        self._next=None;
    def getItem(self):
        return self._item;
    def getNext(self):
        return self._next;
    def setItem(self,newitem):
        self._item=newitem;
    def setNext(self,newnext):
        self._next=newnext;
class SingleLinkedList():
    def __init__(self):
        self._head=None;
        self._size=0;
    def isEmpty(self):
        return self._head==None;
    #add()函数用于在链表前端添加元素
    def add(self,item):
        temp=Node(item);
        temp.setNext(self._head);
        self._head=temp;
    def append(self,item):
        temp=Node(item);
        if self.isEmpty():
            self._head=temp
        else:
            current=self._head;
            while current.getNext()!=None:
                current=current.getNext();
            current.setNext(temp);
    #index()函数用于返回指定元素在链表中的位置,注,返回的并不是下标,而是第几个位置
    def index(self,item):
        current=self._head;
        count=0;
        found=None;
        while current!=None and not found:
            count+=1;
            if current.getItem()==item:
                found=True;
            else:
                current=current.getNext();
        if found:
            return count;
        else:
            raise ValueError,'%s is not in linkedlist '%item
    def remove(self,item):
        current=self._head;
        pre=None;
        while current!=None:
            if current.getItem()==item:
                if not pre:
                    self._head=current.getNext();#该链表就一个节点,并且就是要删的节点时。
                else:
                    pre.setNext(current.getNext());
                break;
            else:
                pre=current;
                current=current.getNext();
    def insert(self,pos,item):
        if pos<=1:
            self.add(item);
        elif pos>self.size():
            self.append(item);
        else:
            temp=Node(item);
            count=1;
            pre=None;
            current=self._head;
            while count<pos:
                count+=1;
                pre=current;
                current=current.getNext();
            pre.setNext(temp);
            temp.setNext(current);
    def size(self):
        count=0;
        if self.isEmpty():
            return count; 
        else:
            current=self._head;
            count=1;
            while current.getNext()!=None:
                current=current.getNext();
                count+=1;
            return count;
    def travel(self):
        
        if self.isEmpty():
            print "null";
        else:
            current=self._head;
            while current.getNext()!=None:
                print current.getItem();
                current=current.getNext();
            print current.getItem();
            
if __name__=='__main__':
    a=SingleLinkedList();
    for i in range(1,10):
        a.append(i);
    print "链表长度为:"+str(a.size());
    print "打印单向链表元素:"
    a.travel();
    print "打印第5个元素:"+str(a.index(5));
    a.remove(4);
    print "删除完位置4的元素:";
    a.travel();
    a.insert(4,100);
    print "插入4位置100:"
    a.travel();

实验结果为:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值