那个结果问题是我故意的..毕竟我的运算函数只有四个操作符号.....结果有输出啊....没有结果不好判断对错了...呵呵... [/quote]
兄弟你搞错了,我是帮楼主改的程序,不是你的那个,呵呵。。。你的没问题啦。。 兄弟,不好意思啊.我还以为你说我呢[tk13] 呵呵 还有楼主说我的不能运行吗?我的是后缀计算表达式哦,你不要输入搞错了。呵呵。。
ok!!!!!!!!了
谢谢两位啦我已经知道怎么回事了 核心就是两个栈先转换为后缀表达式,然后从中间向外边计算
?????????
版主说话总是这么深奥啊 ??????上面的两个程序是不是都是不带括号的,要是带括号该怎么写
上面的两个程序是不是都是不带括号的,要是带括号该怎么写 仔细看...我的是带括号的..... 我也写了一个表达式求值的程序,用C写的。有以下功能: + - * 、 ( )1.可以处理负数,若第一个数为负数,则不需要括号;若负数不是第一个数,则需要括号。
2.可以输入浮点数并计算(double型的)。
3.可以精确到小数点后6位,若小数点后有多余的零,则输出时,可以屏蔽掉(即不输出0)。
4.表达式值的范围:-20亿 到 +20亿
5.除数为0,则输出“除数不能为零”。
6.若左括号多于或少于右括号,则输出“表达式错误”。
7.若输入的数据为 1..2+3 或 1.2.3+4 ,则输出“表达式错误”。
8.若输入的数据为 1.+3 或 .3+4 ,则输出“表达式错误”。
9.可以处理多层括号。
10.若输入 1+ 01 ,则输出“表达式错误”。
11.若只输入一个操作数 或 多层括号中一个操作数 ,则输出 该操作数。
若只输入操作数 或 操作符,则输出 “表达式错误”。
若输入的操作数 或 操作符多输了、或少输了, 则输出 “表达式错误”。
若输入除表达式以外的字符(空格除外),则输出“表达式错误”。
12.表达式的任何地方都可以输入 空格 。
13.例:
输入 输出
1/2回车 0.5
1/3+2/3回车 1
1/3回车 0.333333
2/3回车 0.666667
-4.0/2.0回车 -2
-4.0/(-2.0)/(-1.0)回车 -2
你们评评,看还有哪些功能上的漏洞,过几天,我再把代码上传。 我是这样写的
#include<stdio.h>
#include<conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define OK 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int Status;
typedef char SElemType1;
typedef int SElemType2;
char OP[7]={'+','-','*','/','(',')','#'};
typedef struct
{
SElemType1 *base;
SElemType1 *top;
int stacksize;
}CharStack;
typedef struct
{
SElemType2 *base;
SElemType2 *top;
int stacksize;
}IntStack;
Status initIntStack(IntStack *I)
{
(*I).base=(SElemType2 *)malloc(STACK_INIT_SIZE*sizeof(SElemType2));
if(!(*I).base) exit(OVERFLOW);
(*I).top=(*I).base;
(*I).stacksize=STACK_INIT_SIZE;
return OK;
}
Status initCharStack(CharStack *C)
{
(*C).base=(SElemType1 *)malloc(STACK_INIT_SIZE*sizeof(SElemType1));
if(!(*C).base) exit(OVERFLOW);
(*C).top=(*C).base;
(*C).stacksize=STACK_INIT_SIZE;
return OK;
}
Status desintStack(IntStack *I)
{
(*I).top=NULL;
free((*I).base);
(*I).base=NULL;
return OK;
}
Status descharStack(CharStack *C)
{
(*C).top=NULL;
free((*C).base);
(*C).base=NULL;
return OK;
}
int getinttop(IntStack I)
{
SElemType2 e;
if(I.top==I.base) return ERROR;
e=*(I.top-1);
return e;
}
char getchartop(CharStack C)
{
SElemType1 e;
if(C.top==C.base) return ERROR;
e=*(C.top-1);
return e;
}
Status pushchar(CharStack *C,SElemType1 e)
{
if((*C).top-(*C).base>=(*C).stacksize)
{
(*C).base=(SElemType1 *)realloc((*C).base,((*C).stacksize+STACKINCREMENT)*sizeof(SElemType1));
if(!(*C).base) exit(OVERFLOW);
(*C).top=(*C).base+(*C).stacksize;
(*C).stacksize+=STACKINCREMENT;
}
*(*C).top++=e;
return OK;
}
Status pushint(IntStack *I,SElemType2 e)
{
if((*I).top-(*I).base>=(*I).stacksize)
{
(*I).base=(SElemType2 *)realloc((*I).base,((*I).stacksize+STACKINCREMENT)*sizeof(SElemType2));
if(!(*I).base) exit(OVERFLOW);
(*I).top=(*I).base+(*I).stacksize;
(*I).stacksize+=STACKINCREMENT;
}
*(*I).top++=e;
return OK;
}
Status popchar(CharStack *C,SElemType1 *e)
{
if((*C).top==(*C).base) return ERROR;
*e=*(--(*C).top);
return OK;
}
Status popint(IntStack *I,SElemType2 *e)
{
if((*I).top==(*I).base) return ERROR;
*e=*(--(*I).top);
return OK;
}
Status In(char c,char OP[])
{
int i;
for(i=0;i<=6;i++)
if(c==OP[i]) return TRUE;
return FALSE;
}
int Transfer(char c)
{
int k;
switch(c)
{
case '+':k=0;break;
case '-':k=1;break;
case '*':k=2;break;
case '/':k=3;break;
case '(':k=4;break;
case ')':k=5;break;
case '#':k=6;break;
}
return k;
}
char Precede(char c1,char c2)
{
int i,j;
char a[7][7]={{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',''},
{'>','>','>','>','','>','>'},
{'<','<','<','<','<','','='}};
i=Transfer(c1);
j=Transfer(c2);
return(a[i][j]);
}
int Operate(int a,char c,int b)
{
int z;
switch(c)
{
case '+':z=b+a;break;
case '-':z=b-a;break;
case '*':z=b*a;break;
case '/':z=b/a;break;
}
return z;
}
int EvaluateExpression()
{
int flag=0,num,a,b,answer;
char c,x;
IntStack NUM;
CharStack OPTR;
initCharStack(&OPTR);
pushchar(&OPTR,'#');
initIntStack(&NUM);
c=getchar();
while(c!='#'||getchartop(OPTR)!='#')
{
if(!In(c,OP))
{
if(flag==1)
{
popint(&NUM,&num);
num=num*10+(c-'0');
pushint(&NUM,num);
}
else
{
pushint(&NUM,c-'0');
flag=1;
}
c=getchar();
}
else
{
switch(Precede(getchartop(OPTR),c))
{
case '<':pushchar(&OPTR,c);c=getchar();break;
case '=':popchar(&OPTR,&x);c=getchar();break;
case '>':popchar(&OPTR,&x);
popint(&NUM,&a);
popint(&NUM,&b);
pushint(&NUM,Operate(a,x,b));
break;
}/*switch*/
flag=0;
}
}/*while*/
answer=getinttop(NUM);
desintStack(&NUM);
descharStack(&OPTR);
return answer;
}
main()
{
int loop=1,answer;
while(loop)
{
clrscr();
printf("\n\n\n\t\tPlease input your biaodashi:(end with '#')");
answer=EvaluateExpression();
printf("\n\t\tThe answer is : %d",answer);
printf("\n\t\tOnce again?(1/0)");
scanf("%d%*c",&loop);
}
printf("\n\n\n\t\tThank you for your useing!");
getch();
} 哈哈。我正找这个呢!
页:
1
[2]
