题目描述
对于一个不存在括号的表达式进行计算
输入描述:
存在多种数据,每组数据一行,表达式不存在空格
输出描述:
输出结果
示例1
输入
6/2+3+3*4
输出
18
题目解析:知道符号的优先级,6/2+3+3*4 = 3 + 3 + 12,所以表达式实际上最后是一个加减式。优先计算出/,*的部分表达式,最后将结果加在一起。
代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<vector>
#include<map>
#include<iomanip>
using namespace std;
const int N = 10000;
//也可以用中缀表达式求,用栈求中缀表达式。
//这一种有点缺陷,不会计算1 + 2,可以看我的简单计算器
int main(){
double number;
char fuhao;
double d[N];
while(cin >> number){
memset(d , 0 , sizeof(d));
d[0] = number;
int t = 1;
while(scanf("%c" , &fuhao) != EOF && fuhao != '\n'){
cin >> number;
switch(fuhao){
case '+':
d[t] = number;
break;
case '-':
d[t] = -number;
break;
case '*':
t--;
d[t] = d[t] * number;
break;
case '/':
t--;
d[t] = d[t] / number;
break;
}
t++;
}
double rst = 0;
for(int i = 0 ; i < t ; i++){
rst += d[i];
}
cout << int(rst) << endl;
}
return 0;
}
/* 利用中缀表达式,用栈求中缀表达式。有时间可以完善,出错地方已标出
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<iomanip>
using namespace std;
int computernum(string number){
int sum = 0;
int count = number.size() - 1;
for(int i = 0 ; i < number.size(); i++){
sum += (number[i] - '0') * pow(10,count);
}
return sum;
}
int computerResult(int number1, int number2, char fuhao){
int rst = 0;
switch(fuhao){
case '+':
rst = number1 + number2;
break;
case '-':
rst = number1 - number2;
break;
case '*':
rst = number1 * number2;
break;
case '/':
rst = number1 / number2;
break;
}
cout << "number1: " << number1 << " number2: " << number2 << " fuhao: "<<fuhao << " rst: " << rst << endl;
return rst;
}
bool betterfuhao(char a,char b){
cout << a << " : " << b<< endl;
if((b == '/' && a == '+') || (b == '/' && a == '-') || (b == '*' && a == '+') || (b == '*' && a == '-')){
return true;
}else{
return false;
}
}
int main()
{
string function;
vector<string> vc;
vector<char> vc1;
stack<int> st1;
stack<char> st2;
while(cin >> function){
string temp1,temp2;
int index = 0;
for(int i = 0; i < function.size(); i++){
if(function[i] == '/' || function[i] == '+' || function[i] == '-' ||function[i] == '*'){
vc.push_back(function.substr(index,i-index));
vc1.push_back(function[i]);
index = i + 1;
}
}
vc.push_back(function.substr(index, (function.size() - index)));
st1.push(computernum(vc[0]));
for(int i =1 ; i < vc.size(); i++){
if(st2.empty()){ //栈空,直接放
st1.push(computernum(vc[i]));
st2.push(vc1[i - 1]);
}else{
if(betterfuhao(st2.top(),vc1[i - 1])){ //优先级大进
st2.push(vc1[i - 1]);
}else{ //优先级小出去
char fuhao = st2.top();
st2.pop();
st2.push(vc1[i - 1]); //出去了再进来优先级小的 (******这里有问题,需要继续比较符号大小)
int number2 = st1.top();
st1.pop();
int number1 = st1.top();
st1.pop();
int rst = computerResult(number1,number2,fuhao); //计算
st1.push(rst);
}
st1.push(computernum(vc[i]));
}
}
int t = st2.size();
for(int i = 0; i < t;i++){
char fuhao = st2.top();
st2.pop();
int number2 = st1.top();
st1.pop();
int number1 = st1.top();
st1.pop();
int rst = computerResult(number1,number2,fuhao);
st1.push(rst);
}
cout << st1.top() << endl;
vc.clear();
vc1.clear();
st1.pop();
}
return 0;
}
*/