第1关:栈的应用 - 计算中缀表达式
任务描述
本关任务要求通过实现函数double ComputeInfix(char* s)来计算中缀表达式。
测试说明
本关的测试过程如下:
平台编译 step1/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件; 平台运行该可执行文件,并以标准输入方式提供测试输入; 平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。 输入输出说明: 输入格式: 输入一个中缀表达式。表达式中的操作数都是一个非负的个位数。 输出格式: 输出该表达式的值。
以下是平台对 step1/Main.cpp 的测试样例:
样例输入: (1+2)*(9-6) 样例输出: result = 9.000000
代码如下
#include <stdio.h>
#include <stdlib.h>
#include "LnkStack.h"
#include "Infix.h"
void compute(LinkStack* so, LinkStack* sd)
{
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)
{
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;
}
第2关:栈的应用 - 计算后缀表达式
任务描述
本关任务要求通过实现函数double ComputePostfix(char* s)来计算后缀表达式。
测试说明
本关的测试过程如下:
平台编译 step2/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件; 平台运行该可执行文件,并以标准输入方式提供测试输入; 平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。 输入输出说明: 输入格式: 输入一个后缀表达式。表达式中的操作数都是一个非负的个位数。 输出格式: 输出该表达式的值。
以下是平台对 step2/Main.cpp 的测试样例:
样例输入: 12+96-* 样例输出: result = 9.000000
代码如下
#include <stdio.h>
#include <stdlib.h>
#include "LnkStack.h"
#include "Postfix.h"
double ComputePostfix(char* s)
{
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')
{
LS_Push(so, s[i++] - 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;
}
|