东北大学数据结构算术表达式求值实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告实验内容:算术表达式求值
数据结构实验报告
一.课题概述 (1)
二.概要设计原理 (1)
三.详细程序清单及注释说明 (1)
四.运行与测试及结果 (5)
五.心得体会 (6)
六.参考文献 (6)
一.课题概述
1.实验目的:栈和队列应用类实验题目参考
2.实验内容:算术表达式求值
【问题描述】由输入的四则算术表达式字符串,动态生成算术表达式所对应的后缀式,通过后缀式求值并输出。
【实验要求】
设计十进制整数四则运算计算器。
(1)采用顺序栈等数据结构。可以将数据存储在顺序表中。
(2)给定表达式字符串,后缀表达式。
(3)对后缀表达式求值并输出。
二.概要设计原理
1.数据结构设计
任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
2.算法设计
为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
(1)首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;(2)依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕
三.详细程序清单及注释说明
#include
#include
#include
#include
#define STACK_INIT_SIZE 100;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack1;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack2;
SqStack1 OPND;//运算数栈
SqStack2 OPTR;//运算符栈
char precede(char the,char c)//优先级
{
if(the=='+'||the=='-')
if(c=='+'||c=='-'||c==')'||c=='#') return('>');
else return('<');
if(the=='*'||the=='/')
if(c=='(')
return('<');
else return('>');
if(the=='(')
if(c==')')
return('=');
else return('<');
if(the==')')
return('>');
if(the=='#')
if(c=='#')
return('=');
else return('<');
}
int Operate(int a,char theta,int b)//运算
if(theta=='+')
return(a+b);
if(theta=='-')
return(a-b);
if(theta=='*')
return(a*b);
if(theta=='/')
return(a/b);
}
int qiuzhi()
{
printf("请输入表达式,以#结束: ");
OPTR.base=(char *)malloc(100*sizeof(char));
OPTR.top=OPTR.base;
OPTR.stacksize=STACK_INIT_SIZE;
*OPTR.top++='#';
OPND.base=(int*)malloc(100*sizeof(int));
OPND.top=OPND.base;
OPND.stacksize=STACK_INIT_SIZE;
char abc,theta,c;int a,l=0,i=0,j=0,k=0,b,d=0;int ab[10];
c=getchar();abc='#';
while(c!='#'||*(OPTR.top-1)!='#')
{
if(c>=48&&c<=57)
{
ab[i]=c-48;
i++;
abc=c;
c=getchar();
}
else
{
if(abc=='0'||abc=='1'||abc=='2'||abc=='3'||abc=='4'||abc=='5'||abc==' 6'||abc=='7'||abc=='8'||abc=='9')
{
for(k=i-1;k>=0;k--)
d=d+ab[k]*pow(10,i-k-1);
*OPND.top++=d;
i=0;d=0;
}