C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)3.输入的中缀表达式符合以下要求:(1) 中缀表达式长度不确定.(2) 中缀表
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/01 22:50:22
![C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)3.输入的中缀表达式符合以下要求:(1) 中缀表达式长度不确定.(2) 中缀表](/uploads/image/z/12501201-57-1.jpg?t=C%E8%AF%AD%E8%A8%80%211%EF%BC%8E%E8%A6%81%E6%B1%82%EF%BC%9A%E5%AE%8C%E6%88%90%E6%A0%87%E5%87%86%E4%B8%AD%E7%BC%80%E7%AE%97%E6%9C%AF%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC%E8%BF%90%E7%AE%97.2%EF%BC%8E%E4%B8%AD%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%94%B1%E9%94%AE%E7%9B%98%E8%BE%93%E5%85%A5%2C%E4%BB%A5%E5%9B%9E%E8%BD%A6%E9%94%AE%E7%BB%93%E6%9D%9F.%E5%A6%82%EF%BC%9A3%2A%28%284%2B6%29-%285-2%29%5E3%293%EF%BC%8E%E8%BE%93%E5%85%A5%E7%9A%84%E4%B8%AD%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%AC%A6%E5%90%88%E4%BB%A5%E4%B8%8B%E8%A6%81%E6%B1%82%EF%BC%9A%EF%BC%881%EF%BC%89+%E4%B8%AD%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E9%95%BF%E5%BA%A6%E4%B8%8D%E7%A1%AE%E5%AE%9A.%EF%BC%882%EF%BC%89+%E4%B8%AD%E7%BC%80%E8%A1%A8)
C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)3.输入的中缀表达式符合以下要求:(1) 中缀表达式长度不确定.(2) 中缀表
C语言!
1.要求:完成标准中缀算术表达式求值运算.
2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)
3.输入的中缀表达式符合以下要求:
(1) 中缀表达式长度不确定.
(2) 中缀表达式仅出现在一行输入行中.
(3) 中缀表达式中只包含5种2目运算符:+,-,*,/ ,^及两种优先级运算符“(”和“)”.
“^” 为指数运算,如:4^2=16.
(4) 中缀表达式中的运算数由{0,1,…,8,9}中的单个数字组成.
(5) 中缀表达式中不包含多余的空格.
(6) 中缀表达式在逻辑上和结构上如出现错误,程序应能提示错误.
4.你的程序应输出最终运算结果.
5.为确保你的程序的正确性,完备性,健壮性,请提交前自行设计相应的测试实例进行充分的测试检查.
C语言!1.要求:完成标准中缀算术表达式求值运算.2.中缀表达式由键盘输入,以回车键结束.如:3*((4+6)-(5-2)^3)3.输入的中缀表达式符合以下要求:(1) 中缀表达式长度不确定.(2) 中缀表
#include
#include
#include
#include
char str[100];
int p;
typedef struct node
{
char sym;
struct node *lchild,*rchild;
}BTNode;
BTNode *lastNode;
void Initial()
{
scanf("%s",str);
char str2[100];
int len = strlen(str),i;
for(i = 0;i < len;i++)
{
if(str[len-i-1] == ')')
str2[i] = '(';
else if(str[len-i-1] == '(')
str2[i] = ')';
else
str2[i] = str[len-i-1];
}
str2[i] = '\0';
strcpy(str,str2);
p = 0;
}
void Advance()
{
p++;
}
char SYM()
{
return str[p];
}
bool SYMIsDigital()
{
return SYM() = '0';
}
void A();
void B();
void C();
void D();
void A_();
void B_();
void C_();
void A()
{
if(SYM() == '('||SYMIsDigital())
{
B();
A_();
}
else
exit(0);
}
void A_()
{
BTNode *p,*q;
if(SYM() == '+')
{
p = lastNode;
Advance();
B();
A_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '+';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == '-')
{
p = lastNode;
Advance();
B();
A_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '-';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0')
{
}
else
exit(0);
}
void B()
{
if(SYM() == '('||SYMIsDigital())
{
C();
B_();
}
else
exit(0);
}
void B_()
{
BTNode *p,*q;
if(SYM() == '*')
{
p = lastNode;
Advance();
C();
B_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '*';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == '/')
{
p = lastNode;
Advance();
C();
B_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '/';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0'||SYM() == '+'||SYM() == '-')
{
}
else
exit(0);
}
void C()
{
if(SYM() == '('||SYMIsDigital())
{
D();
C_();
}
else
exit(0);
}
void C_()
{
BTNode *p,*q;
if(SYM() == '^')
{
p = lastNode;
Advance();
D();
C_();
q = lastNode;
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = '^';
lastNode->lchild = p;
lastNode->rchild = q;
}
else if(SYM() == ')'||SYM() == '\0'||SYM() == '+'||SYM() == '-'||SYM() == '*'||SYM() == '/')
{
}
else
exit(0);
}
void D()
{
if(SYMIsDigital())
{
lastNode = (BTNode *)malloc(sizeof(BTNode));
lastNode->sym = SYM();
lastNode->lchild = lastNode->rchild = NULL;
Advance();
}
else if(SYM() == '(')
{
Advance();
A();
if(SYM() == ')')
Advance();
else
exit(0);
}
else
exit(0);
}
double Calculate(BTNode *T)
{
double a,b;
if(T)
{
b = Calculate(T->lchild);
a = Calculate(T->rchild);
if(T->sym sym >= '0')
return (double)(T->sym-'0');
else if(T->sym == '+')
return a+b;
else if(T->sym == '-')
return a-b;
else if(T->sym == '*')
return a*b;
else if(T->sym == '/')
return a/b;
else if(T->sym == '^')
return pow(a,b);
}
}
int main()
{
Initial();
A();
printf("%f\n",Calculate(lastNode));
system("pause");
}
//vs2010下编译通过,使用的是递归下降分析法LL(1)(比较方便实现),在实现过程中翻转了字符串
//如果输入格式不符合直接退出程序(只支持1位的数字)