解一元一次方程伪代码:
class TreeStructure
expression:string ->表达式
left:TreeStructure ->左边的树结构
right:TreeStructure ->右边的树结构
state=0:string ->访问状态
parent:TreeStructure ->指向于父节点
operator:string ->操作符
result:int ->结果
def 栈对字符串根据符号进行分割构造成树(传入一个字符变量str)
声明一个名为root的树,将str填入其构造方法
声明一个栈并将root树压入栈中
while 栈不为空
声明一个名为current的变量并将栈中第一个赋值给它
调用方法查找current的expression中符号所在位置获取返回值并命名为num
IF num为-1
IF 将第一个“(”与最后一个“)”将其消除掉
current出栈
创建一个变量命名为left,并将其出去括号的字符串填入构造方法
将当前出栈的current赋值给left的parent
将left赋值给root树的左树
将left压入栈中
ELSE
current出栈
将当前current对应的expression赋值给它的result属性
ELSE IF num大于0
current出栈
根据下标0到返回值,来截取字符串,得到符号左边的字符串 = leftStr
根据返回值+1到字符串长度,来截取字符串,得到符号右边的字符串 = rightStr
left = new TreeStucture(leftStr)
right = new TreeStucture(rightStr)
将当前num对应的符号赋值给current的operator
将current加入到left.parent作为父节点,并赋值给root的左树
将current加入到right.parent作为父节点,并赋值给root的右树
将right树压入栈中
将left树压入栈中
def 根据树后序遍历出来的结果计算表达式(传入已经构建好的字符串树变量root)
声明一个stack栈并将root压入栈中
while stack栈不为空
current 获取栈顶的树并赋值作为当前的树
IF current的state等于他子节点个数时
IF current.opteator不为空时
对current的opteator运算符进行判断后将current的左右子节点的result进行运算
ELSE IF current只有一个子节点
将current的子节点的result赋值给current的result
将current出栈
IF 将当前current的parent不为空
父节点中state+=1
ELSE
IF 左树不为空
将左树压入stack栈中
IF 右树不为空
将右树压入stack栈中
print(root.result)
def 查找当前字符中的符号所在位置(传入一个字符串)
FOR 对字符串长度进行循环
得到当前下标的单个字符
IF 字符等于"("
计数+1
ELSE IF 字符等于")"
计数-1
ELSE IF 字符=="+" 与 计数==0
返回当前下标
FOR 以字符串最后一个字符开始进行循环
得到当前下标的单个字符
IF 字符等于"("
计数+1
ELSE IF 字符等于")"
计数-1
ELSE IF 字符等于"-" 与 计数==0
返回当前下标
FOR 对字符串长度进行循环
得到当前下标的单个字符
IF 字符等于"("
计数+1
ELSE IF 字符等于")"
计数-1
ELSE IF (字符等于"*" 或 字符等于"/") 与 计数==0
返回当前下标
返回-1
Python实现代码:
class Stack(object): def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def peek(self):
return self.items[len(self.items) – 1]
def size(self):
return len(self.items)
def push(self, item):
self.items.append(item)
def pop(self): return self.items.pop()
class TreeNode(object): def __init__(self, x): self.expression = x self.left = None self.right = None self.parent = None self.state = 0 self.operator = None self.result= None
def structuralTree(str): root = TreeNode(str) stack = Stack() stack.push(root) while stack.size() >0 : current = stack.peek() nums = strToTree(current.expression) if nums == -1 : if current.expression.startswith("(") and current.expression.endswith(")") : current=stack.pop() expression = current.expression[1:len(current.expression)-1]; left = TreeNode(expression) left.parent = current current.left = left stack.push(left) else: current=stack.pop() current.result=current.expression elif nums > 0 : current=stack.pop() leftStr = current.expression[0:nums] rightStr = current.expression[nums+1:len(str)] operator = current.expression[nums:nums+1] current.operator = operator leftTree = TreeNode(leftStr) rightTree = TreeNode(rightStr) leftTree.parent = current rightTree.parent = current current.left = leftTree current.right = rightTree stack.push(rightTree) stack.push(leftTree) return root
def strToTree(str): num = 0 for i in range(len(str)): if str[i] == "(": num += 1 elif str[i] == ")": num -= 1 elif str[i] == "+" and num == 0 : return i for i in range(len(str[::-1])): if str[i] == "(": num += 1 elif str[i] == ")": num -= 1 elif str[i] == "-" and num==0 : return i for i in range(len(str)): if str[i] == "(": num += 1 elif str[i] == ")": num -= 1 elif (str[i] == "*" or str[i] == "/") and num==0 : return i return -1
def postOrder(root): stack = Stack() stack.push(root) while stack.size() >0 : current = stack.peek() num = 0 if current.left != None: num += 1 if current.right != None: num += 1 if current.state == num : if current.operator != None : if current.operator == "+": current.result = int(current.left.result) + int(current.right.result) elif current.operator == "-": current.result = int(current.left.result) – int(current.right.result) elif current.operator == "*": current.result = int(current.left.result) * int(current.right.result) elif current.operator == "/": current.result = int(current.left.result) / int(current.right.result) elif current.left != None and current.right == None: current.result=current.left.result stack.pop() if current.parent != None : current.parent.state += 1 else: if current.left != None: stack.push(current.left) if current.right != None: stack.push(current.right) print(root.expression,"=",root.result)
root = structuralTree("((2+3)/5-(2+3)*4-(3-3))") postOrder(root)
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试