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

数据结构题目算术表达式求值一个算术表达式是由操作数(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;
}
看了 数据结构题目算术表达式求值一...的网友还看了以下:

大家讨论一下二次调查中村界是什么类型的界线在二调中有国界线、行政区域界线、境界线,权属界线、地类界  2020-06-12 …

在生物分类的七个等级中,生物的共同特征最多和最少的分别是()A.界和种B.门和纲C.种和科D.种和  2020-06-13 …

在生物分类的等级单位中,最高和最低的分类单位分别是()A.门、界B.界、科C.纲、种D.界、种  2020-06-21 …

在界、门、纲、目、科、属、种这七个分类等级中,同一等级中生物的共同特征最多的等级和最少的等级分别是  2020-06-21 …

在界、门、纲、目、科、属、种的七个等级中,生物共同特征最少的等级和最多的等级分别是()A.界、种B  2020-07-01 …

栗斑腹鹀是一种世界性濒危鸟类,多栖息于有矮树的山坡草地等中,主食植物种子,夏季也吃小型昆虫.某地区  2020-07-03 …

英语翻译感恩是一种方式,感恩更是一种境界.只有学会感恩,才能得到别人的尊敬与爱戴.感恩,是结草衔环  2020-07-04 …

如图9所示,分界线MN左侧存在平行于纸面水平向右的有界匀强电场,右侧存在垂直纸面向里的有界匀强磁场  2020-07-31 …

如图所示的狭长区域内有垂直于纸面向里的匀强磁场,区域的左、右两边界均沿竖直方向,磁场左、右两边界之  2020-07-31 …

1林耐的双命名规定一种生物的学名组成依次是()A.种名和属名B.属名和种名C.界名和种名D.种名和界  2020-11-15 …