如何使用c语言实现四则运算,详细思路很重要啊(越详细越好~),可以木有代码(急)

1 要考虑容错,提示用户输入错误
2 回合四则运算,要考虑括号,如(2*(3+4*(17-5))+5)/5
解释一下如何用栈来实现~~ 来点代码解释吧~~

1.判断四则运算字符串的括号是否匹配,可以用以个栈来计算,开始栈是空,从头遍历所有字符,找到'(',压栈,找到')'弹出一个元素,遍历完成以后如果栈是空表示正常,非空,或则中间出现问题都表示括号不正常。
2.分解四则运算中的所有元素,把所有分解的元素放在队列中,遍历整个字符串,有switch分支,如果是0-9的字符用一个字符串存储并和前面的字符组合起来,如果是'+''-''*''/'就把前面存储数字的字符串当成一个元素放进队列,并把当前运算法符当成一个元素也放进队列,遍历完成以后所有的数据和运算符都分开了,比如234+456,会分解成234,+,456三个元素。
3.然后分解队列,用两个栈,一个存放所有元素用A表示,一个存放运算符号用B表示(这个是临时变量),从头开始遍历整个队列,如果是数据就把数据压到A栈。如果元素是运算符就分开处理,如果是'(''+''-''*''/'')'处理方法都不一样,详细说明太复杂,整体的思想就是把数据和运算符的顺序排列好(上面的元素排列以后变成234,456,+;可以参考后序排列)。
4.计算:依次弹出A中的元素,如果是数据把数据压在栈C中,如果是运算符,从C中弹出该运算符需要的数据,然后把计算结果再次压进栈C,当A遍历完以后,C顶元素就是计算结果。
整个大题思路:1.检查,2.分解,3.中序排列,4.后序排列,5.计算追问

能不能用代码解释一下。。。

追答

代码太长,这里发不了,字数不够了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-09
输入的时候 要这么输..1*(2+1)
不能输等号...

#include "stdio.h"
#include<stdlib.h>
#include<string.h>
char s[100];

struct my
{
char *s;
int v;
};
void f2(char *s, int f, int f4);
int f1(char *p);
struct my *ff(char *p, int f);
void main( )
{

int i; int f;
char *p;
p=s;
gets(s);

while((f=f1(s))!=-1)
{
f2(s,f,1);
}

}
struct my *ff(char *p, int f)
{

char s1[100];
struct my *r;
char *s;
int i=0, j=1, k=0;
s=p;strcpy(s1,s); r=malloc(sizeof(struct my));
if(f==0)
{
p--;
while(*p>='0'&&*p<='9')
{
i+=(*p-'0')*j;
j=j*10;
p--;
}
p++;
r->v=i; r->s=p;
return r;
}
if(f==1)
{
p++;
while(*p>='0'&&*p<='9') {p++; k++;}
p=s;
p++;
for(f=0; f<k-1; f++) j*=10;
while(*p>='0'&&*p<='9')
{
i+=(*p-'0')*j;
j=j/10;
p++;
}
r->v=i; r->s=p;
return r;
}

}

int f1(char *p) // 确定 运算顺序..
{
int f1=0, f2=0, f3=0;
while(*p!=0)
{
if(*p=='+'||*p=='-') f1=1;
if(*p=='*'||*p=='/') f2=1;
if(*p=='(') f3=1;
*p++;
}
if(f3) return 2;
if(f2) return 1;
if(f1) return 0;
else return -1;
}

void f2(char *s , int f, int f4)
{char s1[100];
char *q, *w, *p=s, *p1=s1;
char e[100] , e1[100];

char *z1, *z2, *z3; int f3;
strcpy(s1,s);
switch(f)
{
case 0:
while(*p!='+'&&*p!='-') {p1++; p++;}
q=ff(p, 0)->s; w=ff(p1,1)->s;
if(*p=='+')
itoa(ff(p,0)->v+ff(p,1)->v, e, 10);
else
itoa(ff(p,0)->v-ff(p,1)->v, e, 10);
break;

case 1:
while(*p!='*'&&*p!='/') {p1++; p++;}
q=ff(p, 0)->s; w=ff(p1,1)->s;
if(*p=='*')
itoa(ff(p,0)->v*ff(p,1)->v, e, 10);
else
itoa(ff(p,0)->v/ff(p,1)->v, e, 10);
break;

case 2:
while(*p!=')')
{ if(*p=='(') z1=p; p++; p1++;}
z2=p; z3=p1;
*z2='\0';
strcpy(e, z1+1);
strcpy(e1, e);
while((f3=f1(e))!=-1)
{
f2(e,f3,0);
}
strcpy(z1, e);
strcat(s,z3+1); puts(s);
break;

}
if(f<=1)
{
strcpy(q,e);
strcat(s,w);
strcpy(s1,s);
if(f4) puts(s);
}
}本回答被提问者采纳
第2个回答  2011-09-09
1,将算式以字符串的格式接收,如A[100]=“123+456×789”;
2,扫描字符串,提取数字和运算符;具体使用回答一的方法。
3,运算乘号两面的数字乘积,
4,运算除号两面的数字的商,
5,运算加,
6,运算减,
7,返回结果

如果是用C++可以考虑运算符重载
第3个回答  2011-09-09
输入3个值
switch(c)
case '+':
return a+b;
break;
...
其他照样了

像这样的话 就只能用栈实现了追问

能不能详细介绍如何用栈实现??给点代码吧~

相似回答