本关任务要求通过实现函数double ComputeInfix(char* s)来计算中缀表达式。
本关的测试过程如下:
平台编译 step1/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;
平台运行该可执行文件,并以标准输入方式提供测试输入;
平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入输出说明:
输入格式:
输入一个中缀表达式。表达式中的操作数都是一个非负的个位数。
输出格式:
输出该表达式的值。
以下是平台对 step1/Main.cpp 的测试样例:
样例输入:
(1+2)*(9-6)
样例输出:
result = 9.000000
/**********************************************************
date: July 2017
copyright: Zhu En(祝恩)
DO NOT distribute this code.
**********************************************************/
#include
#include
#include "LnkStack.h"
#include "Infix.h"
//
void compute(LinkStack* so, LinkStack* sd)
//++++++++++++++++++++++++++++++++++++++++++++++
//so 运算符栈
//sd 操作数栈
//1 从运算符栈出栈一个运算符
//2 从操作数栈出栈两个操作数
//3 用出栈的运算符对出栈的操作数进行运算
//4 将运算结果进操作数栈
//+++++++++++++++++++++++++++++++++++++++++++++++
{
T a,b,c,d;
LS_Pop(so,c);
LS_Pop(sd,a);
LS_Pop(sd,b);
if (c=='*') d=b*a;
else if (c=='/') d=b/a;
else if (c=='+') d=b+a;
else if (c=='-') d=b-a;
else printf("never occur!");
LS_Push(sd, d);
}
double ComputeInfix(char* s)
//计算中缀表达式
{
// 请在此添加代码,补全函数ComputeInfix,计算中缀表达式
/********** Begin *********/
int i=0;
LinkStack* so=LS_Create(); //运算符栈
LinkStack* sd=LS_Create(); //操作数栈
while(s[i])
{
if ('0'<=s[i] && s[i]<='9')
{
LS_Push(sd, s[i++]-48);
continue;
}
if(s[i]=='('||LS_IsEmpty(so))
{
LS_Push(so, s[i++]);
continue;
}
if(s[i]==')')
{
T topitem;
while(LS_Top(so,topitem) && topitem !='(' )
{
compute(so, sd);
}
LS_Pop(so,topitem);
i++;
continue;
}
if(s[i]=='*'||s[i]=='/')
{
T c;
LS_Top(so,c);
if (c=='*' || c=='/')
{
compute(so, sd);
}
LS_Push(so, s[i++]);
continue;
}
if(s[i]=='+'||s[i]=='-')
{
T topitem;
while(LS_Top(so,topitem) && topitem !='(' )
{
compute(so, sd);
}
LS_Push(so, s[i++]);
continue;
}
}
while(!LS_IsEmpty(so))
{
compute(so, sd);
}
T res;
LS_Top(sd,res);
LS_Free(so);
LS_Free(sd);
return res;
/********** End **********/
}
本关任务要求通过实现函数double ComputePostfix(char* s)来计算后缀表达式。
本关的测试过程如下:
平台编译 step2/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;
平台运行该可执行文件,并以标准输入方式提供测试输入;
平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入输出说明:
输入格式:
输入一个后缀表达式。表达式中的操作数都是一个非负的个位数。
输出格式:
输出该表达式的值。
以下是平台对 step2/Main.cpp 的测试样例:
样例输入:
12+96-*
样例输出:
result = 9.000000
/**********************************************************
date: July 2017
copyright: Zhu En
DO NOT distribute this code.
**********************************************************/
#include
#include
#include "LnkStack.h"
#include "Postfix.h"
double ComputePostfix(char* s)
{
// ÇëÔÚ´ËÌí¼Ó´úÂ룬²¹È«º¯ÊýComputePostfix£¬¼ÆËãºó׺±í´ïʽ
/********** Begin *********/
int i = 0;//数组下标
T num1 = 0;
T num2 = 0;
T num = 0;
LinkStack* so = LS_Create(); // 创建运算符栈
while (s[i])
{
if (s[i] >= '0'&&s[i] <= '9')//当检测的数组该位数是一个0-9的数就压入操作数栈
{
LS_Push(so, s[i++] - 48);//因为是字符类型 所以需要ASCII码-48
continue;//不执行本次循环后的操作 直接判断循环条件进而进入下一循环
}
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
LS_Pop(so, num2);
LS_Pop(so, num1);
switch (s[i])
{
case '+':num = num1 + num2; LS_Push(so, num); break;
case '-':num = num1 - num2; LS_Push(so, num); break;
case '*':num = num1 * num2; LS_Push(so, num); break;
case '/':num = num1 / num2; LS_Push(so, num); break;
}
i++;
}
}
LS_Pop(so, num);
return num;
/********** End **********/
}