早教吧作业答案频道 -->其他-->
用栈的知识和算符优先法对算术表达式求值一、实验目的:熟练掌握栈的基本操作,进一步理解栈的应用.二、实验内容:设计一个程序,用算符优先法对算术表达式求值.三、基本要求:以字符
题目详情
用栈的知识和算符优先法对算术表达式求值
一、实验目的:
熟练掌握栈的基本操作,进一步理解栈的应用.
二、实验内容:
设计一个程序,用算符优先法对算术表达式求值.
三、基本要求:
以字符序列的形式从终端输入语法正确的、不含变量的算术表达式,利用算符优先关系,实现对算术四则混合运算表达式求值
五、测试数据:
8.25;
1+2.5+3+4;
8.7-1*5.2;
1024/4*8;
1024/(4*8);
(17.7+2.3)*(6/2);
3-3-3;
8/(9-9);
虽然很想自己搞出来,但是自己的能力实在是很有限,那位大侠给个参考.
一、实验目的:
熟练掌握栈的基本操作,进一步理解栈的应用.
二、实验内容:
设计一个程序,用算符优先法对算术表达式求值.
三、基本要求:
以字符序列的形式从终端输入语法正确的、不含变量的算术表达式,利用算符优先关系,实现对算术四则混合运算表达式求值
五、测试数据:
8.25;
1+2.5+3+4;
8.7-1*5.2;
1024/4*8;
1024/(4*8);
(17.7+2.3)*(6/2);
3-3-3;
8/(9-9);
虽然很想自己搞出来,但是自己的能力实在是很有限,那位大侠给个参考.
▼优质解答
答案和解析
正好我做了一个相关的东西,和你说的不太一样,具体你自己看吧!你参考下吧 写的不是很好 输入时数字只能是0-9,算式末尾以#结束,因为用的是字符,所以说功能有限,
#include
#include
#define NULL 0
typedef struct node{
char date;
struct node *next;
}SNode;
SNode *InitStack(){
SNode *top;
top=(SNode *)malloc(sizeof(SNode));
top->next=NULL;
return top;
}
void PushOptr(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOptr(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
void PushOpnd(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOpnd(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
char GetTop(SNode *top){
return (top->next)->date;
}
int In(char c){
int n;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':n=1;break;
default:n=0;break;
}
return n;
}
char Precede(char x,char y){
int i,j;
int form[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}};
switch(x){
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(y){
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;
}
if(form[i][j]==1)
return '>';
else
if(form[i][j]==-1)
return '':b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}
}
}
return f;
}
void main(){
char result;
result=Eval_Exp();
printf("%d\n",result-'0');
}
#include
#include
#define NULL 0
typedef struct node{
char date;
struct node *next;
}SNode;
SNode *InitStack(){
SNode *top;
top=(SNode *)malloc(sizeof(SNode));
top->next=NULL;
return top;
}
void PushOptr(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOptr(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
void PushOpnd(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOpnd(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
char GetTop(SNode *top){
return (top->next)->date;
}
int In(char c){
int n;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':n=1;break;
default:n=0;break;
}
return n;
}
char Precede(char x,char y){
int i,j;
int form[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}};
switch(x){
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(y){
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;
}
if(form[i][j]==1)
return '>';
else
if(form[i][j]==-1)
return '':b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}
}
}
return f;
}
void main(){
char result;
result=Eval_Exp();
printf("%d\n",result-'0');
}
看了 用栈的知识和算符优先法对算术...的网友还看了以下:
篮球比赛中3分线外中一球记三分,三分线里中一球记2在比赛中张亮共得分21分,他投了15个球,进了三 2020-06-05 …
关于汉字三字重叠的字,如众.5个以上.四字重叠的字.2个三个羊是什么字?有三个鱼或马这个字吗? 2020-07-15 …
猜三字个有云的词语! 2020-07-24 …
用英文写作文三十个单词左右早饭后,格雷斯(Grace)和海伦(Helen)相遇了,两个人互相问好后, 2020-11-04 …
依据相同的元音音素进行字母分家这道题怎么没做他给了ABCDEFGHIJKLMNP这些字母,然后他题目 2020-11-13 …
求关于人心世俗的词语三字四字都行.比如世态炎凉不一定要名词有能力的自创也行三字个性点最好求关于人心世 2020-11-23 …
眼看暑假到了,怎么办呢?我想出了一个“遥控”的办法:和孩子一起制订一份作息时间表,和计划书:进行一个 2020-11-27 …
八年级语文第六课枣核发生的事用三个字概括全文求三字三字越多越好,大胆的说!写了作者的旧同窗干嘛了?用 2020-12-21 …
一次投篮比赛,投进0球的有一人,投进一球的有两人,投进两球的有7人,投进5球的有2人已知进三球或三球 2020-12-30 …
造一首诗做一首诗吧.(田美雪)这三个字都每一句都能进去一个字的那种要爱情诗句最好是我爱田美雪5个字都 2021-02-09 …