问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

算术表达式求值 急求

发布网友 发布时间:2023-03-11 18:32

我来回答

2个回答

热心网友 时间:2023-05-11 19:18

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define error 0
#define ok 1
#define overflow -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OPSETSIZE 7
char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
unsigned char Prior[7][7] = { // 算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
typedef int Status;

template <typename T>
struct SqStack
{
T *top;
T *base;
int stacksize;

};//顺序栈结构模板

template <typename T1,typename T2>
Status InitStack(T1 &S)
{
S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));
if(!S.base) exit (overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return ok;
}//初始化栈函数模板

template <typename T1,typename T2>
Status Push(T1 &S,T2 e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));
if(!S.base) exit (overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return ok;
}//入栈函数模板

template <typename T1,typename T2>
Status Pop(T1 &S,T2 &e)
{
if(S.top==S.base) return error;
e=*--S.top;
return ok;
}//出栈函数模板

template <typename T1,typename T2>
T2 GetTop(T1 S)
{
if(S.top==S.base)
return error;
else
return *(S.top-1);

}//获取栈顶元素模板

Status In(char Test,char* TestOp) {
bool Find=false;
for (int i=0; i< OPSETSIZE; i++) {
if (Test == TestOp[i]) Find= true;
}
return Find;
}//判断是否为运算符

float Operate(float a,unsigned char theta, float b) {
switch(theta) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
default : return 0;
}
}//运算

int ReturnOpOrd(char op,char* TestOp) {
int i;
for(i=0; i< OPSETSIZE; i++) {
if (op == TestOp[i]) return i;
}
return 0;
}

char precede(char Aop, char Bop) {
return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}//ReturnOpOrd和precede组合,判断运算符优先级

float EvaluateExpression() {
// 算术表达式求值的算符优先算法。
// 设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
SqStack<char> OPTR; // 运算符栈,字符元素
SqStack<float> OPND; // 运算数栈,实数元素
char TempData[20];
float Data,a,b;
char theta,c,x,Dr[2];

InitStack<SqStack<char>,char> (OPTR);
Push (OPTR, '#');
InitStack <SqStack<float>,float>(OPND);
strcpy(TempData,"\0");//将TempData置为空
c=getchar();
while (c!= '#' || GetTop<SqStack<char>,char>(OPTR)!= '#')
{
if (!In(c, OPSET))
{
Dr[0]=c;
Dr[1]='\0';//存放单个数
strcat(TempData,Dr);//将单个数连到TempData中,形成字符串
c=getchar();
if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,
并重新置空
{
Data=(float)atof(TempData);
Push(OPND, Data);
strcpy(TempData,"\0");
}
}
else
{ // 不是运算符则进栈
switch (precede(GetTop<SqStack<char>,char>(OPTR), c)) {
case '<': // 栈顶元素优先权低
Push(OPTR, c);
c=getchar();
break;
case '=': // 脱括号并接收下一字符
Pop(OPTR, x);
c=getchar();
break;
case '>': // 退栈并将运算结果入栈
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
} // switch
}
} // while
return GetTop<SqStack<float>,float>(OPND);
} // EvaluateExpression

void main()
{
printf("请输入表达式(end #):\n");
printf("%f\n",EvaluateExpression());
}

热心网友 时间:2023-05-11 19:18

#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define Initsize 10
#define Increment 2
#define Max 1000

typedef char Selemtype;
typedef int Elemtype;

//定义元素是char型的栈
typedef struct
{
Selemtype *base;
Selemtype *top;
int size;
}Stack;

//定义元素是int型的栈
typedef struct
{
Elemtype *base;
Elemtype *top;
int size;
}Stack1;

//创建元素是char型的栈
void Init( Stack &S )
{
S.base = (Selemtype*) malloc (Initsize*sizeof(Selemtype));
S.top = S.base;
S.size = Initsize;
}

//创建元素是int型的栈
void Init1( Stack1 &S )
{
S.base = (Elemtype*) malloc (Initsize*sizeof(Elemtype));
S.top = S.base;
S.size = Initsize;
}

//字符型元素入栈
void Push( Stack &S,char c )
{
if( S.top - S.base >= S.size )
{
S.base = (Selemtype*) realloc (S.base,(Initsize+Increment)*sizeof(Selemtype));
S.top = S.base + S.size;
S.size += Increment;
}
*S.top = c;
S.top++;
}

//int型元素入栈
void Push1( Stack1 &S,int c )
{
if( S.top - S.base >= S.size )
{
S.base = (Elemtype*) realloc (S.base,(Initsize+Increment)*sizeof(Elemtype));
S.top = S.base + S.size;
S.size += Increment;
}
*S.top = c;
S.top++;
}

//删除栈Stack的栈顶元素
void Pop( Stack &S,char &c )
{
S.top--;
c = *S.top;
}

//删除栈Stack1的栈顶元素
void Pop1( Stack1 &S,int &c )
{
S.top--;
c = *S.top;
}

//得到栈Stack的栈顶元素
char Gettop( Stack S )
{
Selemtype *p;
p = S.top - 1;
return *p;
}

//得到栈Stack1的栈顶元素
int Gettop1( Stack1 S )
{
return *(S.top-1);
}

//判断c是否运算符集合中的元素
int In( char c )
{
if( c>='0' && c<='9' )
return 0;
}

char Precede( char in,char out )
{
char c;
int in1,out1;
switch( in )
{
case'+':
case'-':in1 = 3;
break;
case'*':
case'/':in1 = 5;
break;
case'(':
case')':in1 = 1;
break;
case'=':in1 = 0;
break;
}
switch( out )
{
case'+':
case'-':out1 = 2;
break;
case'*':
case'/':out1 = 4;
break;
case'(':out1 = 6;
break;
case')':out1 = 1;
break;
case'=':out1 = 0;
break;
}
if( in1>out1 )
c = '>';
else if( in1<out1 )
c = '<';
else
c = '=';
return c;
}

//表达式操作
char Operate(int a,char theta,int b)
{
switch(theta)
{
case'+':return a+b;
case'-':return a-b;
case'*':return a*b;
case'/':return a/b;
}
}

char OperandType()
{
char c[Max],c1[10],x,theta,*p;
int a,b,i,j,sum;
Stack OPTR;
Stack1 OPND;
Init(OPTR);
Push(OPTR,'=');
Init1(OPND);
scanf("%s",c);
p = c;
while( *p!='=' || Gettop(OPTR)!='=' )
{
if( !In(*p) )
{
sum = 0;
i = 0;
while( !In(*p) )
{
c1[i++] = *p++;

}
i--;
for( j=0;j<=i;j++ )
{
sum += (int)(( c1[j]-'0' )*pow( 10,i-j ));
}
Push1(OPND,sum);
}
if( In(*p) )
switch(Precede(Gettop(OPTR),*p))
{
case'<':
Push(OPTR,*p);
p++;
break;
case'=':
Pop(OPTR,x);
p++;
break;
case'>':
Pop(OPTR,theta);
Pop1(OPND,b);
Pop1(OPND,a);
Push1(OPND,Operate(a,theta,b));
break;
}
}
return Gettop1(OPND);
}

int main()
{
printf("%d\n",OperandType());
return 0;
}
看看是不是你想要的~
算术表达式求值 急求

include &lt;string.h&gt; define error 0 define ok 1 define overflow -1 define STACK_INIT_SIZE 100 define STACKINCREMENT 10 define OPSETSIZE 7 char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};unsigned char Prior[7][7] = { // 算符间的优先关系 '...

匹配公式vlookup匹配出来是n/ a

当使用VLOOKUP函数进行匹配时,如果结果返回“#N/A”错误,这通常意味着在查找表中未找到与查找值相匹配的项。可能的原因有:查找值拼写错误、查找表的范围不正确、查找值不在查找列的列、查找表未进行绝对引用导致范围变动等。为了解决这个问题,需要检查查找值和查找表,确保它们正确无误,并且根据需要调整查找范围或公式设置。如果问题依旧存在,可能需要进一步检查数据或考虑使用其他函数进行查找。Excel一键自动匹配,在线免费vlookup工具,3步完成!Excel在线免费vlookup工具,点击63步自动完成vlookup匹配,无需手写公式,免费使用!

定义一个字符串怎么对它进行算术运算

中缀表达式求值,定义一下优先级,然后用栈实现,或者用递归实现。下面这个给你参考。long long Convert(string mid, long long value);这个函数传入一个中缀表达式,比如x * (x + 2),然后value是x的值,函数最终返回表达式结果。算法如下:a) 定义操作符的优先级,#用来放在栈底,优先级最低值0。

急求!simplifying an expression和 evaluating an expression在数学里...

expression是表达式。前者是简化表达式,后者是对表达式求值。供参考。如有不对欢迎指出。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
...职业学院附属中专学校招生简章公办还是民办电话收费标准 芜湖职业学校中专附属中专学校是公办还是民办学校? dell 型号inspiron 5520开机出现以下英文 电脑开机后出现remove disks or other media为什么? ...出现这样的提示: eboot and select proper boot device ...dmipooldatabootfromcd:diskbootfailureinsersystemdiskandpresse... 电脑开机显示: BOOT FROM CD/DVD DISK BOOT FAILURE, INSER ...从启时出现:Disk boot failure,inser systen disk and press enter... 台式电脑英文D工SKBOOTFAILURE,INSER丅S丫STEMD工SKANDPRESSEN丅_百度... 英雄联盟,连续死很多次但拿助攻也会不会让这个人值钱 SAT语法一道--为什么指代不明? 你好!请问远红外烤灯对盆腔炎管用吗?也就是说肚子疼烤肚子管用吗? 豌豆和黄豆哪个大 什么豆最大?脑急题 黄豆最大的颗粒有多大 世界上最大的豆类 如何把老公苹果手机微信同步 帮忙写白雪公主英文故事..越简单越好 b站工房为什么提现不了 b站贝壳提现失败怎么回事 绑好的螃蟹怎么保存 绑好的螃蟹可以保存多久 适合小孩吃的秋葵怎么做 酿柚子皮的家常做法大全怎么做好吃视频 西安市2023年烟花爆竹政策 西安正月十五放烟花的地方 猪皮上刮下的油有啥用 邯郸之战推迟秦统一30年,你赞成吗? 第二章 春秋无义战25‖邯郸之战:一场输了“国、王、将、相”的战争 不锈钢的清洗方法 李大钊的生活背景与生命事记 C语言版数据结构 表达式求值 无语法错误有逻辑错误 无法计算输出正确答案 求大神解答 2022年农历九月十九宜应聘吗 2022年农历九月十九应聘吉日 天津武清辅警考试时间 我用的是vivox5l微信咋更新 武安人社局那个科管招考 安徽省利辛县公立医院2022年笔试成绩出来了吗 纱布口罩可以重复利用吗 绿萝的养殖及养绿萝的作用 佛教中的轮回,请问是谁来审判或决定一个人死后下一次轮回成什么的?其标准是什么? 兔死狗烹出处 兔死什么来的成语 枭将东徒这个故事的寓意是什么〉 的中心意思 备位充数出处 鸾凤诘笙管,是在一老雕刻上见到,估计应是一典故,求出处与故事。 老对联一幅,歳恊八千璚室厰华筵鳯管鸾笙夀域,会徴十二璘房披寳籍箮花蓂叶衍脩龄。 求文化大神解释一下! 凤管鸾笙是什么意思? 中国有像美国中情局那样的部门吗? “知之为知之,不知为不知,是知也”是出自? 知之为知之不知为不知是谁说的
  • 焦点

最新推荐

猜你喜欢

热门推荐