数据结构表达式求值实验报告1.docVIP

  • 6
  • 0
  • 约4.03千字
  • 约 10页
  • 2018-04-23 发布于河南
  • 举报
数据结构表达式求值实验报告1

算术表达式求值 用算符优先法设计一个具有加、减、乘、除四功能的计算程序掌握栈的数据结构和基本操作。”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。 3 ADT描述 #define changint long int typedef struct sqst { changint shu[stacksize]; char data[stacksize]; changint top; }sqstack; 基本操作: initstack(S) 操作结果:构造一个空栈S。 gettop(S) 初始条件:栈S已存在。 操作结果:用P返回S的栈顶元素。 push(S,ch) 初始条件:栈S已存在。 操作结果:插入元素ch为新的栈顶元素。 pop(S,x) 初始条件:栈S已存在。 操作结果:返回S的栈顶字符型元素。 popshu(st,x) 初始条件:栈S已存在。 操作结果:返回S的栈顶整型元素。 panduan(char x) 操作结果:判断字符是否是运算符,运算符即返回1。 precede(c1, c2) 初始条件:c1,c2为运算符。 操作结果:判断运算符优先权,返回优先权高的。 operate(a,op,b) 初始条件:a,b为整数,op为运算符。 操作结果:a与b进行运算,op为运算符,返回其值。 4.算法的基本思路: (1)首先置操作数栈为空栈,表达式起始符#作为运算符栈的栈底元素; (2) 依次读入表达式中的每个字符,通过运算符判断函数panduan()使操作数进OPND栈; (3)通过函数precede()将运算符与OPTR栈的栈底运算符比较出优先权,若栈顶元素优先权低则输入下个操作数到OPND,若两优先权相等,脱号并接受下一个字符,若栈顶元素优先高,退栈并将运算结果(通过函数operate()运算)入栈。循环上述操作直到表达式求值结束。 (4)返回运算结果。 5.主要函数描述及作用: initstack():构造一个空栈 push():插入元素进栈 gettop():返回栈顶元素 precede():运算符优先权进行判断 pop():字符元素出栈 popshu():整型元素出栈 operate():运算操作数 get():从输入的字符串中依次读入每一个字符 panduan():运算符判断函数 6. 测试结果与分析 上述程序在Visual C++ 6.0环境下加以实现。经过多次测试,程序运行正确。运行结果。如图所示: 7. 收获与体会 通过这次课程设计: 1.我又进一步巩固了C语言的基础,尤其是栈。 2.算法中需要建很多的函数,提高了自己的编程能力有帮助, 3.程序不够简洁,还有待改进,功能还有待更完善。 程序源码: #includestdio.h #includestring.h #includeiostream.h #define stacksize 100 #define changint long int typedef struct sqst { changint shu[stacksize]; char data[stacksize]; changint top; }sqstack; void initstack(sqstack st) { st.top=-1; } char gettop(sqstack st,char x) { if(st.top==-1) return 0; else { x=st.data[st.top]; return x; } } changint push(sqstack st,int x) { if(st.top ==stacksize-1) return 0; else { st.top++; st.data[st.top]=x; st.shu[st.top]=(changint)x; return 1; } } changint pop(sqstack st,char x) { if(st.top ==-1) { return 0; } else { x=st.data[st.top]; st.top--; return 1; } } changint popshu(sqstack st,changint x) { if(st.top ==-1) { return

文档评论(0)

1亿VIP精品文档

相关文档