标签:转换 char include 题目 直接 math 一个 小数点 比较
用栈将算术表达式转换成后缀表达式的形式大家应该不陌生了,但是我在实现计算的时候却发现坑还是不少。
题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述: 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输入
1 + 2
4 + 2 * 5 - 7 / 11
0
输出
3.00
13.36
做这题必须注意几个问题:
具体代码如下:
#include<iostream>
#include<stack>
#include<string>
#include<stdio.h>
#include<cctype>
using namespace std;
/**
* 比较操作符优先级的函数
*/
int OperPrecedence(char a){
if(a == ‘/‘ || a == ‘*‘){
return 3;
}else if(a == ‘+‘ || a == ‘-‘ ){
return 2;
}else if(a == ‘$‘){
return 1;
}else if(a == ‘#‘){
return 0;
}
}
/**
* 实现运算
*/
double operNums(char oper, double num1, double num2){
if(oper == ‘+‘){
return num1 + num2;
}else if(oper == ‘-‘){
return num1 - num2;
}else if(oper == ‘*‘){
return num1 * num2;
}else if(oper == ‘/‘){
return num1 / num2;
}
}
/**
* 实现遇到数字往后移动直到数字确定
*/
int getNum(string str, int &index){
string num = "";
while(isdigit(str[index])){
num += str[index];
index ++;
}
return atoi(num.c_str());
}
int main(){
stack<char> operStack;
stack<double> numStack;
string str;
char oper;
double num1;
double num2;
double sum = 0;
int index = 0, preceResult;
operStack.push(‘#‘);
while (getline(cin, str))
{
str += ‘$‘;
if(str[0] == ‘0‘){
break;
}
while(index < str.size()){
if(str[index] == ‘ ‘){
index++;
}
else if(isdigit(str[index])){
//数字
numStack.push(getNum(str, index));
}else
{
//操作符
//比较优先级
if(OperPrecedence(operStack.top()) < OperPrecedence(str[index])){
operStack.push(str[index]);
index++;
}else{
num2 = numStack.top();
numStack.pop();
num1 = numStack.top();
numStack.pop();
oper = operStack.top();
operStack.pop();
numStack.push(operNums(oper, num1 ,num2));
}
}
}
// std::cout << "sum="<<sum << endl;
printf("%.2f\n", numStack.top());
index = 0;
}
}
标签:转换 char include 题目 直接 math 一个 小数点 比较
原文地址:https://www.cnblogs.com/yuyuan-bb/p/12614656.html