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标准库没有实现链表
实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用.如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常情 ...
随机推荐
- Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比【转】
转自:https://www.cnblogs.com/arnoldlu/p/6253665.html 测试环境:AOSP 7.1.1+Kernel 4.4.17 HW:HiKey Ubuntu 14. ...
- Liunx之KVM搭建图形化的WEB
作者:邓聪聪 我们常在Windowns下使用VMware,当然在Liunx中也有这样的软件供我们使用.生产环境的KVM宿主机越来越多,需要对宿主机的状态进行调控.这里用webvirtmgr进行管理.图 ...
- python3+selenium框架设计09-生成测试报告
使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...
- hibernate框架学习之数据查询(HQL)helloworld
package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...
- Android应用内嵌unity3d游戏项目
在一个现有的Android项目中嵌入unity3d项目 1.将unity3d项目导出android工程 2.将第一步导出的Android工程中assets文件夹和libs文件夹下的所有内容复制到And ...
- web@HTML重要标签详介绍.
1.table标签<table border="1px " rules="groups" cellpadding="5px" cell ...
- FastCGI sent in stderr: "PHP Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in
2018-4-16 17:59:03 星期一 1. 发送带有xml参数的请求时如果是用php curl, 需要将数组形式的post data 用 http_build_query() 转换 2. 接收 ...
- heidiSQL使用简介
2017年12月5日09:49:42 星期二 HeidiSQL下载链接 1. 这个是免费的, 不用辛苦找破解码了, 也不用担心被破解软件装后门 2. 可以一次执行多条SQL语句分开选项卡显示 3. 可 ...
- Navicat系列产品激活教程
准备 本教程可破解12.x版本,如果教程失效请联系我 # 19.1.11 破解暂时失效,请勿更新 (如已更新请卸载重新安装老版本,数据不会丢失 http://download.navicat.com/ ...
- 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]
传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...