From 3cdea7cda6b7516704b09aad094da0a7a803e4e0 Mon Sep 17 00:00:00 2001 From: zart Date: Wed, 24 Apr 2024 15:19:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E8=87=B4=E6=80=A7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.py | 36 +++++++++++++++++++---------- main.py | 66 +++++++++++++++++++++++++++++++++++++++++++++--------- main_ui.py | 12 +++++----- main_ui.ui | 2 +- 4 files changed, 86 insertions(+), 30 deletions(-) diff --git a/data.py b/data.py index d32d0b8..eb28590 100644 --- a/data.py +++ b/data.py @@ -250,19 +250,31 @@ def exp_to_treeNode_dict(exp_ls): # 返回嵌套节点字典 # 写一个函数从TreeNode中还原出表达式 def get_expression(TreeNode): - stack = [] - for node in TreeNode: - if node.NodeType == 'Value': - stack.append(node.FaceValue) - elif node.NodeType == 'Operator': - if node.Ops in ('sin', 'cos', 'tan'): # 三角函数 - right = stack.pop() # 三角函数只有右操作数 - stack.append(f"{node.Ops}({right})") + root = TreeNode[-1] + def get_node_rlt(node): + if node.NodeType == 'Operator': + left_idx = node.LeftNodeID + right_idx = node.RightNodeID + if left_idx is not None: + left_node = find_node_by_id(left_idx, TreeNode) + left_rlt = get_node_rlt(left_node) else: - right = stack.pop() - left = stack.pop() - stack.append(f"({left}{node.Ops}{right})") - return stack.pop() + left_rlt = None + if right_idx is not None: + right_node = find_node_by_id(right_idx, TreeNode) + right_rlt = get_node_rlt(right_node) + else: + right_rlt = None + if left_rlt is None and right_rlt is None: + return None + elif left_rlt is None and right_rlt is not None: + return f"{node.Ops}({right_rlt})" + else: + return f"({left_rlt}{node.Ops}{right_rlt})" + elif node.NodeType == 'Value': + return node.FaceValue + return get_node_rlt(root) + def ExpressionAnalyse(exp_ls): # 返回语法树 diff --git a/main.py b/main.py index 4227ab9..c683b2f 100644 --- a/main.py +++ b/main.py @@ -44,6 +44,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.ex_node_ops.clicked.connect(self.exchange_ops_node) # 修改运算符节点 self.ex_node_self.clicked.connect(self.exchange_two_nodes) # 交换两个节点 self.pushButton_exp.clicked.connect(self.agent_exp) # 生成表达式 + self.pushButton_check_te.clicked.connect(self.check_tree_and_expression) # 验证语法树和表达式是否匹配 def secen_clear(self): self.scene.clear() @@ -59,6 +60,13 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.lb_ops_selected.setText("") # 运算符显示 self.p1_selected.setStyleSheet("border-image: none;") # 清空已选牌面 + self.pushButton_ast.setEnabled(True) + self.pushButton_allan.setEnabled(True) + self.pushButton_dtree.setEnabled(True) + self.pushButton_autosv.setEnabled(True) + + + def select_ops(self, ops): self.lb_ops_selected.setText(ops) @@ -126,8 +134,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.seq = 1 # 重置序号 for noed in self.TreeNode: print("运算符节点", noed) - exps = data.get_expression(self.TreeNode) - print("表达式", exps) + # exps = data.get_expression(self.TreeNode) + # print("表达式", exps) else: QMessageBox.warning(self, '警告', '请先选择两个节点') else: @@ -149,7 +157,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.TreeNode: for node in self.TreeNode: if node.NodeID == self.selected_id[0]: - node.FaceValue = self.selected_value + node.FaceValue = str(self.selected_value) for nodet in self.scene.items(): if isinstance(nodet, RoundedRectangleItem): if nodet.id == self.selected_id[0]: @@ -211,8 +219,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): elif item.id == self.selected_id[1]: item.text = str(node_2.FaceValue) item.update() - - else: QMessageBox.warning(self, '警告', '请选择两个节点') @@ -247,7 +253,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def load_image(self, path, Tree_4_nums, index): def current_selection(value, path): - self.selected_value = value + self.selected_value = str(value) self.p1_selected.setStyleSheet(f"border-image: url({path});") self.pushButton_ast.setEnabled(False) self.pushButton_allan.setEnabled(False) @@ -270,10 +276,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): def show_card(self): self.secen_clear() # 清空画布 - self.pushButton_ast.setEnabled(True) - self.pushButton_allan.setEnabled(True) - self.pushButton_dtree.setEnabled(True) - self.pushButton_autosv.setEnabled(True) # 原始数组 self.lineEdit.clear() self.label_result.setText(" =? ") @@ -368,6 +370,48 @@ class MainWindow(QMainWindow, Ui_MainWindow): if opl in ops and opr in ops: return True + def check_tree_and_expression(self): # 检查节点树和表达式是否一致 + if self.TreeNode is not None: + aexp = self.lineEdit.text() + if aexp == '': + QMessageBox.warning(self, '警告', '请输入表达式') + return + try: + exp_ls = data.get_postfix_expression(aexp) # 获取后缀表达式列表 + TreeNode2 = data.ExpressionAnalyse(exp_ls) # 将后缀表达式转化为节点树 + if self.check_tree(self.TreeNode, TreeNode2): + QMessageBox.information(self, '提示', '节点树与表达式一致') + else: + QMessageBox.warning(self, '警告', '节点树与表达式不一致') + except Exception as e: + QMessageBox.warning(self, '警告', '表达式错误') + return + else: + QMessageBox.warning(self, '警告', '当前无语法树') + + + # 检查两个节点树是否一致的函数 + + def check_tree(self, TreeNode1, TreeNode2): + if len(TreeNode1) != len(TreeNode2): + return False + for i in range(len(TreeNode1)): + if TreeNode1[i].NodeID != TreeNode2[i].NodeID: + return False + if TreeNode1[i].NodeType != TreeNode2[i].NodeType: + return False + if TreeNode1[i].Ops != TreeNode2[i].Ops: + return False + if TreeNode1[i].FaceValue != TreeNode2[i].FaceValue: + return False + if TreeNode1[i].LeftNodeID != TreeNode2[i].LeftNodeID: + return False + if TreeNode1[i].RightNodeID != TreeNode2[i].RightNodeID: + return False + return True + + + def draw_tree(self): self.scene.clear() aexp = self.lineEdit.text() @@ -457,7 +501,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.label_TF.setStyleSheet("color: red;background-color:rgb(219, 205, 166)") def agent_exp(self): - if self.TreeNode is not None: + if len(self.TreeNode) > 0: exp_str = data.get_expression(self.TreeNode) if exp_str is not None: self.label_result.clear() # 清空显示结果 diff --git a/main_ui.py b/main_ui.py index c8b787c..9a50678 100644 --- a/main_ui.py +++ b/main_ui.py @@ -121,10 +121,10 @@ class Ui_MainWindow(object): self.pushButton_ast.setObjectName(u"pushButton_ast") self.pushButton_ast.setGeometry(QRect(690, 270, 141, 41)) self.pushButton_ast.setFont(font1) - self.pushButton_9 = QPushButton(self.frame) - self.pushButton_9.setObjectName(u"pushButton_9") - self.pushButton_9.setGeometry(QRect(860, 270, 141, 41)) - self.pushButton_9.setFont(font1) + self.pushButton_check_te = QPushButton(self.frame) + self.pushButton_check_te.setObjectName(u"pushButton_check_te") + self.pushButton_check_te.setGeometry(QRect(860, 270, 141, 41)) + self.pushButton_check_te.setFont(font1) self.label = QLabel(self.frame) self.label.setObjectName(u"label") self.label.setGeometry(QRect(760, 170, 101, 31)) @@ -267,9 +267,9 @@ class Ui_MainWindow(object): #endif // QT_CONFIG(tooltip) self.pushButton_ast.setText(QCoreApplication.translate("MainWindow", u"\u751f\u6210\u8bed\u6cd5\u6811", None)) #if QT_CONFIG(tooltip) - self.pushButton_9.setToolTip(QCoreApplication.translate("MainWindow", u"

\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002

", None)) + self.pushButton_check_te.setToolTip(QCoreApplication.translate("MainWindow", u"

\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002

", None)) #endif // QT_CONFIG(tooltip) - self.pushButton_9.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u81f4\u6027\u68c0\u67e5", None)) + self.pushButton_check_te.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u81f4\u6027\u68c0\u67e5", None)) self.label.setText(QCoreApplication.translate("MainWindow", u"\u5df2\u9009\u724c\u9762", None)) self.p1_selected.setText("") self.pushButton_add.setText(QCoreApplication.translate("MainWindow", u"+", None)) diff --git a/main_ui.ui b/main_ui.ui index 9bd0070..f99bde6 100644 --- a/main_ui.ui +++ b/main_ui.ui @@ -343,7 +343,7 @@ 生成语法树 - + 860