算术表达式的求解-数据结构课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

题目:算术表达式求值

一、需求分析

1、设计要求:

给定一个算术表达式,通过程序求出最后的结果

1>、从键盘输入要求解的算术表达式;

2>、采用栈结构进行算术表达式的求解过程;

3>、能够判断算术表达式正确与否;

4>、对于错误表达式给出提示;

5>、对于正确的表达式给出最后的结果;

2、设计构想:

为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。

二、概要设计

1、本程序包含的模块:

(1)栈模块——实现栈抽象数据类型

(2)运算模块——实现数据表达式的运算(3)主程序模块

三、详细设计

(1)栈模块

1、定义栈结构

struct Sqstack

{

elemtype *top;//栈顶元素

elemtype *base; //栈底元素

int stacksize;//栈的大小

};

2、栈的基本操作

①初始化栈

status initstack(struct Sqstack &s)

{

s.base=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!s.base)

return OVERFLOW;

s.top=s.base;

s.stacksize=stack_size;

return OK;

}

②入栈

status push(struct Sqstack &s,elemtype e)

{

if(s.top-s.base>=s.stacksize)

{

s.base=(elemtype*)realloc(s.base,(s.stacksize+stack_increase ment)*sizeof(elemtype));

if(!(s.base))

return OVERFLOW;

s.top=s.base+s.stacksize;

s.stacksize+=stack_increasement;

}

* s.top++=e;

return OK;

}

③出栈

elemtype pop(struct Sqstack &s)

{

elemtype e;

if(s.top= =s.base)

return ERROR;

e=*--s.top;

return e;

}

④取栈顶元素

elemtype gettop(struct Sqstack &s)

{

elemtype e;

if(s.top==s.base)

return ERROR;

e=*(s.top-1);

return e;

}

(2)运算模块

1、判断输入字符c是否为操作符:若是,则返回1;否则,返回0

int In(int c)

{

char p[10]="+-*/()#^";

int i=0;

while(p[i]!='\0')

{

if(p[i]==c)

return 1;

i++;

}

return 0;

}

2、判断运算符的优先级

char precede(char top,char c)

//该函数为判断当前运算符与前一个运算符的优先级,前一个运算符高于或等于当前运算符的优先级则返回‘>’,前一个运算符小于当前运算符的优先级则返‘<’,当前一个运算符为‘(’当前运算符为‘)’时返回‘=’,用于去除表达式的括号。

{

char result;

switch(c)

{

case '#': result='>'; break;

case '+':

case '-':

if(top=='#'||top=='(')

result='<';

else

result='>'; break;

case '*':

case '/':

if(top=='*'||top=='/'||top=='^')

result='>';

else

result='<'; break;

case '%':

if(top=='%'||top=='/'||top=='^'||top=='*')

result='>';

else

result='<';break;

case ')':

if(top=='(')

result='=';

else

result='>'; break;

相关文档
最新文档