目录
题目要求:
本题要求实现一个函数, 计算后缀表达式的值。(规定:逆波兰表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格键分隔,操作符只可能有+、-、*、/四种运算。例:后缀表达式为2 14 32 + * =,则结果为:92)
函数接口定义:
int calculate(string cal[],double &re);
解释接口参数:其中cal
和re
是用户传入的参数。cal
表示给定的后缀表达式,re
是calculate函数计算出的表达式值;函数返回1或0,1表示该表达式合法,0表示该表达式不合法(包括操作数多了,运算符多了,或除数为0等)。
裁判测试程序样例:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
double compute(double x1, char f, double x2);//x1和x2是两个操作数,f是运算符,函数的返回值为该运算的结果,此函数已实现
int calculate(string cal[],double &re); // 要实现的函数
int main()
{
string cal[100];
int i;
double re;
for (i = 0; i < 100; i++)
{
cin >> cal[i];
if (cal[i] == "=")break;
}
if(calculate(cal,re)==0) cout << "表达式不正确";
else cout << "="<<re;
return 0;
}
输入样例:
在这里给出一组输入。例如:
2 14 32 + * =
输出样例:
在这里给出相应的输出。例如:
=92
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
学习时间:
2022/11/2
- 星期三晚上20:00
- 受同学指教,对于cal变成二维数组判断进入元素是否为数字大为震撼,原本是直接判断非"+,-,*,/",结果报错只得了15分
随便写写的答案:
int calculate(string cal[],double &re)
{
stack<double> st;
int i =0;
double b = 0;
double a = 0;
while(cal[i] != "=")
{
if(cal[i][0]<='9'&&cal[i][0]>='0')
st.push(stod(cal[i]));
else
{
if(!st.empty())
{
b = st.top();
st.pop();
}
else
return 0;
if(!st.empty())
{
a = st.top();
st.pop();
}
else
return 0;
if(cal[i] == "+")
st.push(a+b);
else if(cal[i] == "-")
st.push(a-b);
else if(cal[i] == "*")
st.push(a*b);
else if(cal[i] == "/")
{
if(b!=0)
{
st.push(a/b);
}
else
return 0;
}
}
i++;
}
re = st.top();
st.pop();
if(st.empty())
return 1;
else
return 0;
}