题目如下【问题描述】设计一个程序,求解算术表达式。【基本要求】 以字符序列的形式从键盘输入语法正确的、不含变量的整数表达式,实现对算术四则混合运算表达式的求值。如:输入9-(2+4*7)/5+3【选做内容】(1) 能够演示在求值过程中运算符栈、操作数栈、输入字符和主要操作的变化过程。
【实现提示】一般人们在书写表达式时采用的是“中缀”表达式,如:8+5*(7-3),但是这种表达式不利于计算机处理。我们可以定义后缀表达式即将运算符跟在俩个操作数后面。如:中缀:8+5*(7-3)后缀:8573-*+,若要计算该表达是只要从左向右扫描表达式,直到遇到一个运算符,然后直接取它前面的俩个操作数进行运算。如上例第一次执行7-3,表达式变为854*+,然后8 20+,在计算出结果28。这种方法比较简单。也就是说我们可以份俩步:先将中缀表达式转化为后缀表达式,再对后缀表达式进行运算。 请高手帮忙
数据结构课程设计 表达式求解问题 求一C程序
答案:2 悬赏:50
解决时间 2021-02-17 03:00
- 提问者网友:騷女、無惡不作
- 2021-02-16 09:30
最佳答案
- 二级知识专家网友:嗷呜我不好爱
- 2021-02-16 09:46
呵呵 自己做吧 能学到很多东西 我以前就是自己做的 别偷懒哦
全部回答
- 1楼网友:厭世為王
- 2021-02-16 10:08
跟你的要求符合
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define maxlen 100
typedef struct
{
char op;
int level;
}opt;
typedef struct //定义操作符栈
{
opt st[maxlen];
int top;
}op_stack;
typedef struct //定义值栈
{
double d[maxlen];
int top;
}d_stack;
//--------对栈操作的定义-------------
opt peek(op_stack *s) //定义看栈顶函数
{
opt error=;
if(s->top>=0)
return s->st[s->top];
else
return error;
}
int isempty(op_stack *s) //定义判断栈空的函数
{
if(s->top<0)
return 0;
else
return s->st[s->top].op;
}
char push(op_stack *s,opt c) //定义入栈函数
{
s->top++;
s->st[s->top]=c;
return c.op;
}
opt pop(op_stack *s) //定义出栈函数
{
opt i;
opt error=;
if(s->top>=0)
{
i=s->st[s->top];
s->st[s->top].op='\0';
s->top--;
return i;
}
else
return error;
}
void clear(op_stack *s) //定义初始化栈
{
s->top=-1;
}
//-----------------------------define the value stack-----------------------
double dpeek(d_stack *s) //定义看栈顶函数
{
if(s->top>=0)
return s->d[s->top];
else
return 0;
}
int disempty(d_stack *s) //定义判断栈空的函数
{
if(s->top<0)
return 0;
else
return (int)(s->d[s->top]);
}
double dpush(d_stack *s,double c) //定义入栈函数
{
s->top++;
s->d[s->top]=c;
return c;
}
double dpop(d_stack *s) //定义出栈函数
{
double i;
if(s->top>=0)
{
i=s->d[s->top];
s->d[s->top]='\0';
s->top--;
return i;
}
else return 0;
}
void dclear(d_stack *s) //定义初始化栈
{
s->top=-1;
}
double calval(char *exp)
{
op_stack os; //定义两个栈
d_stack ds;
char tmp[maxlen]=;
int i=0,leng;
double dtmp,dpoptmp;
opt a=;
opt r=;
opt m=;
opt d=;
opt b=;
opt mo=;
clear(&os);
dclear(&ds);
//-----定义初始化结束-----
while(*exp!='\0')
{
while(*exp >= '0' && *exp <= '9' || *exp == '.')
{
while(*exp >= '0' && *exp <= '9' || *exp == '.')
{
tmp[i++]=*exp++;
}
dtmp=atof(tmp);
dpush(&ds,dtmp);
leng=strlen(tmp);
for(i=0;i=a.level)
{
switch(pop(&os).op)
{
case '%':
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=dpop(&ds)+dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)-dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
push(&os,a);
*exp++;
}
break;
case '-':
if(!isempty(&os) || peek(&os).level < r.level)
{
push(&os,r);
*exp++;
}
else
{
while(isempty(&os) && peek(&os).level>=r.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=dpop(&ds)+dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)-dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
push(&os,r);
*exp++;
}
break;
case '*':
if(!isempty(&os) || peek(&os).level < m.level)
{
push(&os,m);
*exp++;
}
else
{
while(isempty(&os) && peek(&os).level>=m.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
push(&os,m);
*exp++;
}
break;
case '/':
if(!isempty(&os) || peek(&os).level < d.level)
{
push(&os,d);
*exp++;
}
else
{
while(isempty(&os) && peek(&os).level>=d.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
push(&os,d);
*exp++;
}
break;
case '%':
if(!isempty(&os) || peek(&os).level < mo.level)
{
push(&os,mo);
*exp++;
}
else
{
while(isempty(&os) && peek(&os).level>=mo.level)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
push(&os,mo);
*exp++;
}
break;
case '(':
push(&os,b);
exp++;
break;
case ')':
while(peek(&os).level!=-2)
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=dpop(&ds)+dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)-dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
pop(&os); //弹出 (
exp++;
break;
}
}
while(isempty(&os))
{
switch(pop(&os).op)
{
case '%' :
dpoptmp=dpop(&ds);
dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp);
dpush(&ds,dpoptmp);
break;
case '*' :
dpoptmp=dpop(&ds)*dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '/' :
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)/dpoptmp;
dpush(&ds,dpoptmp);
break;
case '+':
dpoptmp=dpop(&ds)+dpop(&ds);
dpush(&ds,dpoptmp);
break;
case '-':
dpoptmp=dpop(&ds);
dpoptmp=dpop(&ds)-dpoptmp;
dpush(&ds,dpoptmp);
break;
}
}
return dpop(&ds);
}
void main()
{
char string[maxlen];
char *p=string;
printf("输入表达式:\n");
gets(p);
printf("%s=%f\n\n",string,calval(p));
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯