题目描述
计算一个表达式的运算结果
使用C++自带stack堆栈对象来实现
参考课本的算法伪代码P53-54
输入
第一个输入t,表示有t个实例
第二行起,每行输入一个表达式,每个表达式末尾带#表示结束
输入t行
输入样例:
2
1+2*3-4/5#
(66+(((11+22)*2-33)/3+6)*2)-45.6789#
输出
每行输出一个表达式的计算结果,计算结果用浮点数(含4位小数)的格式表示
用cout控制浮点数输出的小数位数,需要增加一个库文件,并使用fixed和setprecision函数,代码如下:
#include <iostream>
#include<iomanip>
using namespace std;int main()
{ double temp = 12.34
cout<<fixed<<setprecision(4)<<temp<<endl;
}
输出结果为12.3400
输出样例:
6.2000
54.3211
代码
#include <iostream>
#include <stack>
#include<iomanip>
using namespace std;
char Prior[7][7] = {
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='},
};
char ope[7] = {'+','-','*','/','(',')','#'};
string ToSuffix(string s, int len){
string str = "";
stack<char> sta;
int key[len];
for(int i = 0; i < len; i++ ){
key[i] = -1;
for(int j = 0; j < 7; j++){
if(s[i] == ope[j]) {
key[i] = j;
break;
}
}
}
int k=0;
while(key[k] != 6){
if(key[k] != -1 && k != 0){
str += " ";
}
if(key[k] == -1){
str += s[k];
}else{
if(sta.empty() || key[k] == 4 || sta.top() == 4){
sta.push(key[k]);
}else if(key[k] == 5){
int v = sta.top();
while(v != 4){
str += ope[v];
sta.pop();
v = sta.top();
}
sta.pop();
}else{
int v = sta.top();
if(key[k] == 5){
while(v != 4){
str += ope[v];
sta.pop();
v = sta.top();
}
if(v == 4){
sta.pop();
}
}else{
if(Prior[key[k]][v] == '>' && v != 4){
sta.push(key[k]);
}else{
while(Prior[key[k]][v] == '<' && v != 4){
str += ope[v];
sta.pop();
v = sta.top();
}
sta.push(key[k]);
}
}
}
}
k++;
}
while(!sta.empty()){
str += ope[sta.top()];
sta.pop();
}
return str;
}
double comb(string str){
int len = str.length();
char ct[100] = {"\0"};
int jsc = 0, i = 0, key[len];
stack<double> sta;
for(int k = 0; k < len; k++ ){
key[k] = -1;
for(int j = 0; j < 7; j++){
if(str[k] == ope[j]) {
key[k] = j;
break;
}
}
}
while(i < len) {
while (str[i] != ' ' && key[i] == -1) {
ct[jsc] = str[i];
jsc++;
i++;
}
if((str[i] == ' ' && jsc != 0) || (str[i] != -1 && jsc != 0)){
double d = atof(ct);
for(int v = 0; v <= jsc; v++){
ct[v] = '\0';
}
jsc = 0;
sta.push(d);
}else if(str[i] == ' '){
while(str[i] == ' '){
i++;
}
continue;
}
double a,b,c;
if(key[i] != -1){
b = sta.top();
sta.pop();
a = sta.top();
sta.pop();
if(key[i] == 0){
c = a+b;
sta.push(c);
}else if (key[i] == 1){
c = a - b;
sta.push(c);
}else if(key[i] == 2){
c = a * b;
sta.push(c);
}else if(key[i] == 3) {
c = a / b;
sta.push(c);
}
i++;
}
}
double res = sta.top();
return res;
}
int main()
{
int t,len;
string s,suffix="";
cin >> t;
while(t--){
cin >> s;
len = s.length();
suffix = ToSuffix(s,len);
double key = comb(suffix);
cout << fixed << setprecision(4) << key << endl;
}
return 0;
}