python---自己来打通节点,链表,栈,应用
但,,
没有调试通过。
思路是对的,立此存照。
关键就是用链表完全实现列表的功能,
替换了就应该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---自己来打通节点,链表,栈,应用的更多相关文章
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- Python递归_打印节点信息
Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- python算法与数据结构-单链表(38)
一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...
- python中的数据结构-链表
一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...
- C语言 复杂的栈(链表栈)
//复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...
- Leetcode:面试题 04.03. 特定深度节点链表
Leetcode:面试题 04.03. 特定深度节点链表 Leetcode:面试题 04.03. 特定深度节点链表 先贴一下自己写过一个模板,按层数遍历: https://www.cnblogs.co ...
- Python手写模拟单向链表对象,栈对象和树
单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...
- [转]为什么python标准库没有实现链表
实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用.如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常情 ...
随机推荐
- codevs 1080 线段树练习(线段树)
题目: 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x ...
- 【OpenGL】【计算机图形学原理】撸课本系列一
P13 简单二维图元的生成方法 #include <GL/glut.h> //用于表示openGL允许采用 glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存 g ...
- 移动硬盘和u盘的区别
移动硬盘和U盘都属于便携性存储器,用于计算机之间的数据交换.但移动硬盘和U盘的区别还是非常大的,包括内部构造.容量以及整体外观上. 移动硬盘又分为机械移动硬盘和固态移动硬盘两种,主要区别在于内置的存储 ...
- [NOI2004]郁闷的出纳员(到底是谁郁闷啊?)
一道 FHQ treap 的裸水题,卡了这么久.(咦~一看就是修为不够) 题解什么的,不用看的(话说那我为什么要写这篇题解咧...),直接 FHQ 模板腾上去就能秒 A 了(打脸) 谈谈 de ...
- Power Network POJ - 1459 [网络流模板]
http://poj.org/problem?id=1459 嗯,网络流模板...多源点多汇点的图,超级汇点连发电厂,用户连接超级汇点 Status Accepted Time 391ms Memor ...
- 解决ssh登陆很慢的问题
解决步骤: 先备份/etc/ssh/sshd_config,备份命令为 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 1.su (以root用户登录 ...
- SQL语句常用约束类型
常用五类约束: not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复.唯一 forei ...
- PHP中使用Redis长连接笔记
pconnect函数声明 其中time_out表示客户端闲置多少秒后,就断开连接.函数连接成功返回true,失败返回false: pconnect(host, port, time_out, pers ...
- 2018 github热门项目
github流行的几个项目,我们来学习一下. 1. developer-roadmap-chinese image.png 项目简介:2018年web程序员路线中文版, 这个仓库里包含了一些前端,后端 ...
- Windows7上完全卸载Oracle 12c操作步骤
注:本文来源于:< Windows7上完全卸载Oracle 12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...