数据结构算术表达式求值C语言含代码及运行截图.docx
- 文档编号:24379581
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:9
- 大小:86.25KB
数据结构算术表达式求值C语言含代码及运行截图.docx
《数据结构算术表达式求值C语言含代码及运行截图.docx》由会员分享,可在线阅读,更多相关《数据结构算术表达式求值C语言含代码及运行截图.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构算术表达式求值C语言含代码及运行截图
数据结构算术表达式求值(C语言)
1.题目内容
算术表达式求值演示
2.对该问题的简要分析
1.设置运算符栈和运算数栈辅助分析算法优先关系。
2.在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,3.以及相应的运算。
4.在识别出运算数的同时,要将其字符序列形式转换成整数形式。
5.在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。
3.程序实现方法(如:
采用什么存储结构、用到了栈或队列或递归程序设计方法等)
运用栈的抽象数据类型定义,表达式求值程序是一个多次调用函数的过程,且调用的过程较为复杂。
在while循环时指针移动容易出错,因此多次出现内存错误,对于涉及的循环的操作开始和结束条件设置很关键。
本次实验熟悉了栈数据结构的表示与实现方法。
算法时间和空间分析:
算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。
此算法在运行时所占用的临时空间主要取决于栈S的大小,显然,它的最大深度不会超过表达式中操作数的个数,因为操作数的个数与运算符(假定把’#’也看作为一个特殊运算符,即结束运算符)的个数相等,所以此算法的空间复杂度也同样为O(n)
4.用户手册(如何运行该程序,对输入数据有何要求等)
请输入正确的表达式以'#'结尾即可,要求符号均为英文状态
5.测试结果(输入了什么,结果是什么,可以用截屏图来表示)
6.源程序文件名列表(如:
T1.CPP——主程序,T1.H——头文件等)
#include
#include
#include
#defineNULL0
#defineOK1
#defineERROR-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT20/*定义字符类型栈*/
typedefstruct{
intstacksize;
char*base;
char*top;
}Stack;/*定义整型栈*/
typedefstruct{
intstacksize;
int*base;
int*top;
}Stack2;/*-----------------全局变量---------------*/
StackOPTR;/*定义运算符栈*/
Stack2OPND;/*定义操作数栈*/
charexpr[255]="";/*存放表达式串*/
char*ptr=expr;
intInitStack(Stack*s)//构造运算符栈
{
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
s->base)returnERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
returnOK;
}
intInitStack2(Stack2*s)//构造操作数栈
{
s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
s->base)returnERROR;
s->stacksize=STACK_INIT_SIZE;
s->top=s->base;
returnOK;
}
intIn(charch)//判断字符是否是运算符,运算符即返回1
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
intPush(Stack*s,charch)//运算符栈插入ch为新的栈顶元素
{
*s->top=ch;
s->top++;
return0;
}
intPush2(Stack2*s,intch)//操作数栈插入ch为新的栈顶元素
{
*s->top=ch;
s->top++;
return0;
}
charPop(Stack*s)//删除运算符栈s的栈顶元素,用p返回其值
{
charp;
s->top--;
p=*s->top;
returnp;
}
intPop2(Stack2*s)//删除操作数栈s的栈顶元素,用p返回其值
{
intp;
s->top--;
p=*s->top;
returnp;
}
charGetTop(Stacks)//用p返回运算符栈s的栈顶元素
{
charp=*(s.top-1);
returnp;
}
intGetTop2(Stack2s)//用p返回操作数栈s的栈顶元素
{
intp=*(s.top-1);
returnp;
}/*判断运算符优先权,返回优先权高的*/
charPrecede(charc1,charc2)
{
inti=0,j=0;
staticchararray[49]={
'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','!
','>','>','>','>','!
','>','>','<','<','<','<','<','!
','='};
switch(c1){
/*i为下面array的横标*/
case'+':
i=0;break;
case'-':
i=1;break;
case'*':
i=2;break;
case'/':
i=3;break;
case'(':
i=4;break;
case')':
i=5;break;
case'#':
i=6;break;
}
switch(c2){
/*j为下面array的纵标*/
case'+':
j=0;break;
case'-':
j=1;break;
case'*':
j=2;break;
case'/':
j=3;break;
case'(':
j=4;break;
case')':
j=5;break;
case'#':
j=6;break;
}
return(array[7*i+j]);/*返回运算符*/
}
/*操作函数*/
intOperate(inta,charop,intb)
{
switch(op)
{
case'+':
return(a+b);
case'-':
return(a-b);
case'*':
return(a*b);
case'/':
return(a/b);
}
return0;
}
intnum(intn)//返回操作数的长度
{
charp[10];
itoa(n,p,10);//把整型转换成字符串型
n=strlen(p);
returnn;
}
intEvalExpr()//主要操作函数
{
charc,theta,x;intn,m;
inta,b;
c=*ptr++;
while(c!
='#'||GetTop(OPTR)!
='#')
{
if(!
In(c))
{if(!
In(*(ptr-1)))ptr=ptr-1;
m=atoi(ptr);//取字符串前面的数字段
n=num(m);
Push2(&OPND,m);
ptr=ptr+n;
c=*ptr++;
}
Else
switch(Precede(GetTop(OPTR),c))
{
case'<':
Push(&OPTR,c);
c=*ptr++;
break;
case'=':
x=Pop(&OPTR);
c=*ptr++;
break;
case'>':
theta=Pop(&OPTR);
b=Pop2(&OPND);a=Pop2(&OPND);
Push2(&OPND,Operate(a,theta,b));
break;
}
}
returnGetTop2(OPND);
}
intmain()
{
printf("请输入正确的表达式以'#'结尾:
");
do{
gets(expr);
}while(!
*expr);
InitStack(&OPTR);/*初始化运算符栈*/
Push(&OPTR,'#');/*将#压入运算符栈*/
InitStack2(&OPND);/*初始化操作数栈*/
printf("表达式结果为:
%d\n",EvalExpr());
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算术 表达式 求值 语言 代码 运行 截图
![提示](https://static.bdocx.com/images/bang_tan.gif)