2 hu yewen HU_YEWEN 于 2016.03.20 00:59 提问

这是我写的表达式求值,在编译器中运行是对的,但在刷题系统中却说是错,求打什么呢帮我找找Bug 2C

#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"string.h"
#include"math.h"
#define OK 1
#define ERROR 0
#define true 1
#define false 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
char OP[8]={'+','-','*','/','(',')','#','^'};
unsigned char Prior[8][8]={{'>','>','<','<','<','>','>','<'},
{'>','>','<','<','<','>','>','<'},
{'>','>','>','>','<','>','>','<'},
{'>','>','>','>','<','>','>','<'},
{'<','<','<','<','<','=',' ','<'},
{'>','>','>','>',' ','>','>','>'},
{'<','<','<','<','<',' ','=','<'},
{'>','>','>','>','<','>','>','>'}};

typedef int Status;
typedef char CElemType;
typedef float FElemType;

typedef struct CSqStack
{
CElemType *base;
CElemType *top;
int stacksize;
}CSqStack;
typedef struct FSqStack
{
FElemType *base;
FElemType *top;
int stacksize;
}FSqStack;

Status InitCStack(CSqStack &S)//建立字符栈
{
S.base=(CElemType *)malloc(STACK_INIT_SIZE*sizeof(CElemType));
if(!S.base) return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status InitFStack(FSqStack &S)//建立实型栈
{
S.base=(FElemType *)malloc(STACK_INIT_SIZE*sizeof(FElemType));
if(!S.base) return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status CPush(CSqStack &S,CElemType e)//插入字符元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(CElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(CElemType));
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status FPush(FSqStack &S,FElemType e)//插入实型元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(FElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(FElemType));
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
char CPop(CSqStack &S)//出栈
{
if(S.base==S.top) return ERROR;
return *--S.top;
}
char CGetTop(CSqStack S)//返回字符栈的栈顶
{
if(S.base==S.top) return ERROR;
return *(S.top-1);
}
float FPop(FSqStack &S)//出栈
{
if(S.base==S.top) return ERROR;
return *--S.top;
}
float FGetTop(FSqStack S)//返回实型栈的栈顶
{
if(S.base==S.top) return ERROR;
return *(S.top-1);
}

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

}
Status In(char Test,char *OP)//判断是否属于运算符
{
int flag=false;
for(int i=0;i<8;i++)
{
if(Test==OP[i]) flag=true;
}
return flag;
}

char Precede(char c1,char c2)
{
int m,n,i;
for(i=0;i<8;i++)
{if(c1==OP[i]) m=i;
if(c2==OP[i]) n=i;}
return Prior[m][n];
}

void EvaluateExpression()
{
float data,m,n;
char s[128],s1[128],b[20],a[]={'\0'},d[]={'#','\0'},*p,theta;
CSqStack OPTR;
FSqStack OPND;
InitCStack(OPTR);
InitFStack(OPND);
gets(s);//输入字符串
strncpy(s1,s,strlen(s)-1);//因为题目要求,在表达式后面要加上"=",
//为避免下面运算麻烦,我将s的前strlen(s)-1个复制到s1中
CPush(OPTR,'#');//入栈
p=strcat(s1,d);
strcpy(b,a);//将b中初始化为'\0'
while(*p!='#'||CGetTop(OPTR)!='#')
{
if(!In(*p,OP))//不是运算符
{
d[0]=*p;
strcat(b,d);p++;
if(In(*p,OP))
{
data=atof(b);//字符串转换为实型
FPush(OPND,data);//进栈
strcpy(b,a);//再次使里面为'\0'
}
}
else{
switch(Precede(CGetTop(OPTR),*p)){
case'<':CPush(OPTR,*p);p++;break;//栈顶元素优先级低
case'=':CPop(OPTR);p++;break;//脱括号并接收下一字符
case'>':theta=CPop(OPTR);//退栈并将运算结果入栈
m=FPop(OPND);n=FPop(OPND);
FPush(OPND,Operate(n,theta,m));break;

        }

    }
}
printf("%.0f",FGetTop(OPND));//输出结果

}
int main()
{
EvaluateExpression();
return 0;
}

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.20 07:12

什么刷题系统,你的程序用的什么输入,输入格式是否符合要求。

HU_YEWEN
HU_YEWEN OJ系统,用C++,在编译器中正常输入,输入方式编译器也没任何提示或警告,请帮我看看,不胜感激,这道题困扰了我几天了。
2 年多之前 回复
HU_YEWEN
HU_YEWEN   2016.03.20 09:46

OJ系统,用C++,在编译器中正常输入,输入方式编译器也没任何提示或警告,请帮我看看,不胜感激,这道题困扰了我几天了。

huatian5
huatian5   2016.03.20 11:36

显示wrong anwer还是prensentation ???

HU_YEWEN
HU_YEWEN OJ系统给我的最终回复是“错误”,按往常错的话是有错误提示的,这次没有,又在编译器中能输出正确答案,所以我也就找不出错哪了,麻烦研究研究
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
痴情只为无情苦,我欲真心对人 却成了种错情根,人活在世上 究竟是为了什么
宁静山村 一场杀戮 青云大殿 拜师学艺 立志斩妖除魔 问世间 何为正道 何为魔道 在我看来 一切都是杀戮 一切终将要结束 不 我不甘 重来 宁静山村 一场杀戮 两相依少年 青云山上拜师学艺 斩妖除魔 九幽阴灵 诸天神魔 以我血躯 奉为牺牲 但 谁又能看穿 天地不仁 以万物为刍狗 人活在世上 究竟是为了什么 这一剑 不 重来 铃铛咽 百花凋 人影渐瘦鬓如霜 深情苦 痴情苦 痴情只为无情苦 原来 狐
使用逆波兰式进行表达式求值
中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现。实现和原理讲解有一点不同,需要进一步进行细化。 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈
栈的应用:四则运算表达式求值
栈的一个应用就是四则运算表达式的求值,
MATLAB符号表达式->函数->求值
有时候需要解符号表达式得到某个量关于其他量的显式表达式,MATLAB解出的结果任然是符号表达式,我们希望可以用这个表达式构造函数,进一步求值。
C#算术表达式求值
算术表达式求值是一个经典的问题,很多学习编程的人都对此不陌生.本来我并不想写一个算术表达式求值的算法.在网上我看到了一篇文章,名叫(http://www-128.ibm.com/developerworks/cn/java/j-w3eva/).才有兴趣着一个玩玩.写来写去,觉得真得很经典.所以把我写的代码拿出来让大家看看吧.因为时间较紧.所以变量名没有做得很规范.w3eavl是用JAVA写得,我用
ACM,表达式求值、函数表达式求值,ACM表达式求值
观察函数每一个都是二元函数f(x,y)的形式。我们先解决这种没有嵌套,例如add(x,y)表示的是x+y,这不是蛮简单的吗?但是呢add(x,y)是一个字符串表达式(我们用str来表示),无法直接返回这个x+y的值。于是写两个函数来获取这个表达式的第一个参数和第二个参数的值getexp1(str)和getexp2(str),它们分别返回了这个表达str的1 2个参数的值。于是这个表达式的结果为add=getexp1(str)+getexp2(str) sub=getexp1(str)-getexp2(s
表达式求值算法
编写代码对算术表达式求值的经典方法由 Donald Knuth 描述于 1962 年(请参阅 参考资料)。Knuth 将此概括为三个步骤: 对中缀表达式进行语法分析中缀表达式到后缀表达式的转换对后缀表达式求值 注意到我们谈到的这个经典算法有些简化:算术表达式只包含操作数、二元操作符和一种括号。此外,对于每个操作数和操作符,只用单个字符表示,使语法分析直观。 表达式表示法 算
表达式解题报告
题目描述 表达式6×9=42对于十进制来说是错误的,但是对于十三进制来说是正确的。即6(13)×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是写一段程序读入3个整数p、q和r,然后确定一个进制B(2≤B≤16)使得p×q=r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) ×11(3)=121(3),11
[数据结构] 表达式求值(转化为后缀表达式再求值或直接求值)
两种情况: 1. 根据输入的算数表达式,如(56-20) /(4+2), 先转化为后缀表达式(逆波兰式)56#20#-4#2#+/  因为输入的数字有多位数的(56),所以数之间用#隔开,然后根据后缀表达式求值。 2.根据输入的算数表达式,直接进行求值。 对于情况1: 转化为后缀表达式时用到了一个符号栈,把后缀表达式存放到数组postExp中,根据后缀表达式求值时用到了一个运算数栈
T1413 确定进制(#Ⅰ- 6 - 1)
【题目描述】    6*9=42对于十进制来说是错误的,但是对于13进制来说是正确的。即6(13)*9(13)=42(13),而 42(13)=4*131+2*130=54(10)。    你的任务是写一段程序,读入三个整数p、q和 r,然后确定一个进制 B(2≤B≤40) 使得p*q=r。如果 B 有很多选择, 输出最小的一个。  例如:p=11, q=11, r=121.则有11(3)*11(...