早教吧 育儿知识 作业答案 考试题库 百科 知识分享

数据结构题目算术表达式求值一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含+、-、*、/等四种运算符,界限符有左右圆括号和

题目详情
数据结构题目
算术表达式求值
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含+、-、*、/等四种运算符,界限符有左右圆括号和表达式结束符“#”,如:(7+15)*(23-28/4)#。编程按照算术运算规则,求算术表达式的值。
提示:通过“栈”实现。
请给出源代码
▼优质解答
答案和解析
本人原创,已通过编译,速度采纳亲
#include
#include
#define MAXSIZE 100
#define INCREMENT 10
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char elemtype;
typedef struct
{
elemtype * top;
elemtype * base;
int stacksize;
}stack;
int initstack(stack &S)
{
S.base=(elemtype *)malloc(MAXSIZE * sizeof(elemtype));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
elemtype gettop(stack S)
{
if(S.top==S.base) return '\0';
return *(S.top-1);
}
int push(stack &S,elemtype e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(elemtype *)realloc(S.base,(S.stacksize+INCREMENT)*sizeof(elemtype));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=INCREMENT;
}
*S.top++=e;
return OK;
}
int pop(stack &S,elemtype &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
int in(elemtype c)
{
if('0'<=c&&'9'>=c)
return 0;
return 1;
}
int exchange(elemtype c)
{
switch(c)
{
case '+':return 1;
case '-':return 2;
case '*':return 3;
case '/':return 4;
case '(':return 5;
case ')':return 6;
case '#':return 7;
}
}
int precede(char a,char b)
{
int x,y;
x=exchange(a)-1;
y=exchange(b)-1;
int list[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,-2},{1,1,1,1,-2,1,1},{-1,-1,-1,-1,-1,-2,0}};
return list[x][y];
}
elemtype operate(elemtype a,elemtype theta,elemtype b)
{
switch(theta)
{
case '+':
return (a-'0'+b);
case '-':
return (a-b+'0');
case '*':
return ((a-'0')*(b-'0')+'0');
case '/':
return ((a-'0')/(b-'0')+'0');
}
}

elemtype count()
{
stack optr,opnd;
initstack(optr);
push(optr,'#');
initstack(opnd);
elemtype c;
c=getchar();
elemtype x,a,b,theta;
while(c!='#'||gettop(optr)!='#')
{
if(!in(c))
{
push(opnd,c);
c=getchar();
}
else
switch(precede(gettop(optr),c))
{
case -1:
push(optr,c);
c=getchar();
break;
case 0:
pop(optr,x);
c=getchar();
break;
case 1:
pop(optr,theta);
pop(opnd,b);
pop(opnd,a);
push(opnd,operate(a,theta,b));
break;
}
}
return gettop(opnd);
}
int main(void)
{
printf("输入表达式\n");
int m=count()-'0';
printf("结果为%d\n",m);
return 0;
}
看了 数据结构题目算术表达式求值一...的网友还看了以下:

赤霉素具有促进植物茎秆伸长的作用,其作用机理如下图所示。根据图中所给信息分析,下列说法错误的是A.  2020-05-13 …

n=m/M这个公式中,m代表质量,n代表物质的量,M代表摩尔体积,物质的量的符号是n,单位是mol  2020-05-13 …

碳酸二甲酯的馏程为多少?有两个样品,一个实际蒸馏为88-90℃一个为83-90℃,但不知道国标要求  2020-06-08 …

下列仪器中,用来加热的是,用来取少量固体药品的是,用来滴加少量液体的是?下列仪器中,用来加热的是,  2020-06-18 …

下列化学用语与所表述的意义不相符的是()①2H--2个氢元素②3H2O--3个水分子③CuO--氧  2020-07-05 …

下列有关气体压强的说法中,与实际不符的是()A.卫生间洗手池的回水管是利用大气压的作用B.吸盘能吸  2020-07-13 …

在word中,有关数学公式的描述,下面正确的是A插入公式和插入字符时在同一个窗口中进行的B安装Of  2020-07-26 …

下列有关碳单质的用途和性质之间的关系不相符的是()A.焦炭用于炼铁是因为焦炭具有还原性B.金刚石用  2020-07-29 …

去污的方法有多种,下列说法正确的是()A.常用汽油除去油污是利用溶解性B.洗涤剂常用来洗涤油污,是因  2020-11-05 …

下列关于氏族公社的表述与历史发展不符的是[]A.禅让制是氏族公社初期民主推选首领的制度B.进入父系氏  2020-11-06 …