但,,

没有调试通过。

思路是对的,立此存照。

关键就是用链表完全实现列表的功能,

替换了就应该OK的。

# coding = utf-8

# 节点初始化
class Node:
    def __init__(self, init_data):
        self.data = init_data
        self.next = None

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, new_data):
        self.data = new_data

    def set_next(self, new_next):
        self.next = new_next

# 实现列表方法
class UnorderedList:
    def __init__(self):
        # 链表类本身不包含任何节点对象。
        # 它只包含对链接结构中第一个节点的单个引用。
        self.head = None

    def is_empty(self)->bool:
        return self.head is None

    # 加到链表第一项
    def add(self, item):
        temp = Node(item)
        temp.set_next(self.head)
        self.head = temp

    # 加到链表最后一项
    def append(self, item):
        if self.head is None:
            self.add(item)
        else:
            temp = Node(item)
            current = self.head
            previous = None
            while current is not None:
                previous = current
                current = current.get_next()
            previous.set_next(temp)

    # 这个动作和append一样
    def push(self, item):
        self.append(item)

    # 删除链表节点时,需要使用previous保存前一个节点
    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found and current is not None:
            if current.get_data() == item:
                found = True
            else:
                previous = current
                current = current.get_next()
        if not found:
            raise Exception("not found.")
        if previous is None:
            self.head = current.get_next()
        else:
            previous.set_next(current.get_next())

    # 经典循环链表节点,并设置哨兵位
    def search(self, item):
        current = self.head
        found = False
        while current is not None and not found:
            if current.get_data() == item:
                found = True
            else:
                current = current.get_next()
        return found

    def size(self):
        current = self.head
        count = 0
        while current is not None:
            count += 1
            current = current.get_next()
        return count

    def index(self, item):
        found = False
        count = 0
        current = self.head
        while current is not None and not found:
            count += 1
            if current.get_data() == item:
                found = True
            else:
                current = current.get_next()
        if not found:
            raise Exception("not found.")
        return count

    def insert(self, pos, item):
        if self.head is None:
            raise Exception("not init")
        elif pos > self.size():
            raise Exception("pos is too large")
        else:
            temp = Node(item)
            current = self.head
            previous = None
            for i in range(pos):
                previous = current
                current = current.get_next()
            temp.set_next(current)
            previous.set_next(temp)

    def pop(self):
        current = self.head
        previous = None
        for i in range(self.size()-1):
            previous = current
            current = current.get_next()
        pop_value = current.get_data()
        previous.set_next(None)
        return pop_value

    def peek(self):
        current = self.head
        previous = None
        while current is not None:
            previous = current
            current = current.get_next()
        return previous.get_data()

    def pop_pos(self, pos):
        current = self.head
        previous = None
        for i in range(pos):
            previous = current
            current = current.get_next()
        pop_value = current.get_data()
        previous.set_next(current.get_next())
        return pop_value

    def show(self):
        current = self.head
        tmp = ''
        while current is not None:
            current = current.get_next()
            tmp += current.get_data()
        return tmp

'''
my_list = UnorderedList()
my_list.add(31)
my_list.add(77)
my_list.add(17)
my_list.add(93)
my_list.add(26)
my_list.add(54)
my_list.add(68)
my_list.append(100)
my_list.append(110)
my_list.insert(2, 57)
print(my_list.pop(), '=========pop===')
print(my_list.pop_pos(5), '=========pop_pos===')
my_list.show()
print(my_list.peek(), '=========peek===')
print(my_list.size())
print(my_list.search(68))
try:
    my_list.remove(310)
except Exception as error:
    print(error)

try:
    print(my_list.index(54))
except Exception as error:
    print(error)
my_list.show()
'''

class Stack:
    def __init__(self):
        self.items = UnorderedList()

    # 是否为空
    def is_empty(self):
        return self.items.is_empty()

    # 进栈
    def push(self, item):
        self.items.append(item)

    # 出栈
    def pop(self):
        return self.items.pop()

    # 返回栈顶值,不改变栈
    def peek(self):
        return self.items.peek()

    # 返回栈长度
    def size(self):
        return self.items.size()

def infix_to_postfix(infix_expr):
    prec = dict()
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    prec[")"] = 1
    postfix_expr = []
    s = Stack()
    for item in infix_expr.split():
        # 如果标记是操作数,将其附加到输出列表的末尾
        if item not in prec.keys():
            postfix_expr.append(item)
        # 如果标记是左括号,将其压到 s 上
        elif item == '(':
            s.push(item)
        # 如果标记是右括号,则弹出 s,直到删除相应的左括号。将每个运算符附加到
        # 输出列表的末尾
        elif item == ')':
            while s.peek() != '(':
                postfix_expr.append(s.pop())
            s.pop()
        # 如果标记是运算符, *,/,+  或  -  ,将其压入 s。但是,首先删除已经在
        # s 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中
        else:
            while (not s.is_empty()) \
                    and (prec[s.peek()] >= prec[item]):
                postfix_expr.append(s.pop())
            s.push(item)
        print(s.items.show())
    # 当输入表达式被完全处理时,检查 s。仍然在栈上的任何运算符都可以删除并加到
    # 输出列表的末尾
    while not s.is_empty():
        postfix_expr.append(s.pop())

    return ' '.join(postfix_expr)

def postfix_eval(postfix_expr):
    s = Stack()
    for item in postfix_expr.split():
        # 如果不是运算符号,压栈
        if item not in '+-*/':
            s.push(item)
        else:
            # 如果是运算符号,取出栈上最近两个数字进行运算
            # 然后,再将结果压回栈
            op2 = int(s.pop())
            op1 = int(s.pop())
            print(op1, item, op2)
            result = do_match(item, op1, op2)
            s.push(result)
        print(s.items.show())
    return result

# 运行结果
def do_match(op, op1, op2):
    if op == '+':
        return op1 + op2
    elif op == '-':
        return op1 - op2
    elif op == '*':
        return op1 * op2
    elif op == '/':
        return op1 / op2
    else:
        raise Exception('Error operation!')

infix_str = '( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )'

postfix_output = infix_to_postfix(infix_str)
print(infix_str)
print(postfix_output)
postfix_result = postfix_eval(postfix_output)
print(postfix_result)

  

python---自己来打通节点,链表,栈,应用的更多相关文章

  1. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  2. Python递归_打印节点信息

    Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...

  3. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  4. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  5. python中的数据结构-链表

    一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...

  6. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  7. Leetcode:面试题 04.03. 特定深度节点链表

    Leetcode:面试题 04.03. 特定深度节点链表 Leetcode:面试题 04.03. 特定深度节点链表 先贴一下自己写过一个模板,按层数遍历: https://www.cnblogs.co ...

  8. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  9. [转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用.如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常情 ...

随机推荐

  1. HDOJ 1698 Just a Hook (线段树)

    题目: Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing f ...

  2. Python-列表的常用操作

    #先定义一个列表 names = ["ZhangXueyou","LiMing","GuoFucheng","LiuDehua&q ...

  3. libevent的入门学习-库的安装【转】

    转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现 ...

  4. 利用 ffmpeg 的 maskedmerge 滤镜, 从视频中提取移动对象

    ffmpeg \ -i background.png \ -i video.mkv \ -filter_complex \ " color=#00ff00:size=1280x720 [ma ...

  5. Android Day1

    [2013-10-04 9:49]  复习第一课. Building Your First App; 1.安装好SDK 后,启动Eclipse,新建一个Android工程.设置使用默认. 2.检查文件 ...

  6. 模块 -- 序列化 hashlib sha logging (加密 加盐 )

    模块:  一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...

  7. CURL错误代码及含义

    https://curl.haxx.se/libcurl/c/libcurl-errors.html NAME libcurl-errors - error codes in libcurl DESC ...

  8. 用layui搭建的后台框架

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. sleep()和wait()的区别及wait方法的一点注意事项

    一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep方法不会释放锁对象. 当调用sleep方 ...

  10. Confluence 6 使用 Apache 和 mod_proxy 添加 SSL和其他

    添加 SSL 如果你计划在你的应用中启用 SSL ,请参考 Securing your Atlassian applications with Apache using SSL页面中的内容,并确定你在 ...