关于算术表达式求值问题
题目
关于算术表达式求值问题
如何判断一个算术表达式是否合法 只考虑加减乘除括号
给个思路
答案
#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());
}
给你一个完全的程序,本人自己写的.
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
最新试题
- 不是分贝的意思.这个DB出现在一本侦探小说里面,原话是这样的:She found the body,it turns that the DB was someone she work with,我个人
- 7500牛力是多少啊?
- 一个圆形水池,中间有一圆形小岛.水池的周长是50.24m,小岛的周长是12.56m.这个水池的水域面积是多少㎡
- 怎样才可以发生水解反应
- 已知点M(-2,4)及焦点为F的抛物线y=18x2,在此抛物线上求一点P,使|PM|+|PF|的值最小
- 一个边长为4m的正方形建筑物,四周是草地,在它一角拴一只羊,绳子长是5m,羊能吃到草的总面积是多少平方米?
- 请问小孔成像成的是什么样的像,为什么
- 数字俗语-----表示做事考虑不周到,干了再说时用
- 形容非常圆的成语
- 欲速则不达告诉我们的道理
热门考点
- 客观唯心主义是谁定义或者分类的?
- 关于一元二次方程不等式的一道题
- 先想好运算顺序再认真计算. 145÷5×6 60×24+540÷9 464÷(101-97) 4800÷60+68 (24+16)×(50-32) 15×(89-510÷6)
- 数学判断题4.2与3的比值是1.4是对的吗
- 求证:1/√(2k+1)
- 5x+x的平方-4x+2-7x的平方,其中x=5
- 已知a.b是方程x²-4x+m+0 的两个根, b,c是方程y²-8y+5m=0 的两个根, 则m的值为 .
- 已知0<A<90,0<B<90,则B/2的取值范围是 ,A+B/2的取值范围是 ,A-B的取值范围是
- 一个平行四边形的面积是3,6 平方厘米,如果底和高都扩大到原来的3倍,面积是多少平方厘米?
- 船从甲港顺水到乙港后回甲港公用8小时,顺水比逆水每小时多行12千米,前4小时比后4小时多行30千米,甲乙距离?