《数据结构与算法》实验报告 |
|||
学生姓名 |
郭茁宁 |
院(系) |
计算机科学与技术 |
学 号 |
1183710109 |
专 业 |
软件工程 |
实验时间 |
2019年11月8 日(周五) |
实验地点 |
格物213室 |
实验项目 |
实验1/4:线性结构及其应用 |
||
实验目的:将课程的基本原理、技术和方法与实际应用相结合,训练和提高学生组织、存储和处理信息的能力,以及复杂问题的数据结构设计能力和程序设计能力,培养软件设计与开发所需要的实践能力。 实验要求:灵活运用基本的数据结构和算法知识,对实际问题进行分析和抽象;结合程序设计的一般过程和方法为实际问题设计数据结构和有效算法;用高级语言对数据结构和算法进行编程实现、调试,测试其正确性和有效性。 |
|||
实验题目2/2:算术表达式求值 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。设计一个程序,演示用算符优先法对算术表达式求值的过程。
|
|||
数据结构定义: Class Stack:栈 lv:运算符等级字典 vals:变量等级字典 |
|||
算法设计与分析(要求画出核心内容的程序流程图): 流程图: 问题分为以下三个子问题:
插入附加功能:
|
|||
实验测试结果及结果分析: 测试结果:全对,非常稳定,不惧怕任何强数据 结果分析:每个数据,首先输出预处理的列表,再输出中缀表达式,然后若有自变量则要求用户输入值,最后计算答案 |
|||
问题及解决方法: 我已流畅解决实验要求,没有问题,具体解决方案详见上文。现对实验测试数据提出问题:
|
|||
源程序名称:Lab-1.2.py |
注意:正文文字为宋体小4号,图中文字为宋体5号。行距为多倍行距1.25。
源程序与此报告打包提交,压缩包采用学号命名。
import os
class Stack(object):
def __init__(self): self.stack=[]
def push(self,val): self.stack.append(val)
def pop(self):
if (not self.empty()): return self.stack.pop()
def empty(self): return bool(not self.stack)
def top(self):
if (not self.empty()): return self.stack[-1]
NUM='0123456789.'
ops='+-*/^'
lv={'(':5,')':0,'#':1,'+':2,'-':2,'*':3,'/':3,'^':4}
chs=[chr(i) for i in range(97,123)]
vals={}
def Shift(str_list):
sta=Stack()
ans_str=[]
for x in str_list:
if (x[0] in NUM or x[0] in chs):
ans_str.append(x)
else:
while (not sta.empty() and (sta.top() in ops) and lv[x]<=lv[sta.top()]):
ans_str.append(sta.pop())
if (ans_str[-1] in '()#'): ans_str.pop()
sta.push(x)
if (x!='('):
while (not sta.empty() and (sta.top() not in ops)): sta.pop()
while (not sta.empty()):
ans_str.append(sta.pop())
if (ans_str[-1] in '()#'): ans_str.pop()
return ans_str
def op(x2,x1,op):
if (op=='+'): return x1+x2
elif (op=='-'): return x1-x2
elif (op=='*'): return x1*x2
elif (op=='/'): return x1/x2
elif (op=='^'): return x1**x2
def Calc(shift_list):
ans_num=[]
for x in shift_list:
if (x in ops):
ans_num.append(op(ans_num.pop(),ans_num.pop(),x))
else:
if (x[0] in chs):
ans_num.append(float(vals[x]))
else:
ans_num.append(float(x))
return round(ans_num[0],2)
fin=open("D:\\GZN\\HIT\\个人文件\\数据结构与算法\\Lab1\\test.txt","r")
for str1 in fin:
s=str1.strip()
str_list=[]
s_len=len(s)
i=0
j=1
while (i<=j and j<s_len):
while (s[j] in NUM or (s[j] not in ops and s[j] not in lv.keys())): j+=1
str_list.append(s[i:i+1])
if (i+1<j): str_list.append(s[i+1:j])
i=j
j+=1
for x in str_list:
if (x=='#'): str_list.remove(x)
print (str_list)
shift_list=Shift(str_list)
print (' '.join(shift_list))
vals.clear()
for item in shift_list:
if (item[0] not in NUM and item[0] not in lv.keys() and item not in vals.keys()):
print (item+'=',end='')
vals[item]=input()
print (' '.join(str_list),'=',Calc(shift_list))
os.system("pause")