您的位置:首页 > 其它

算法训练 表达式计算

2017-12-11 08:13 323 查看
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cctype>

using namespace std;

stack<int> stack_num;
stack<char> stack_op;

bool f(char ch1, char ch2){
// 1-2+3     1*2/3
if ((ch1 == '-'||ch1 == '+') && (ch2 == '+'|| ch2 == '-') )
return false;
if ((ch1 == '*' || ch1 == '/') && (ch2 == '*' || ch2 == '/'))
return false;

// 1*2-3
if ((ch1 == '*' || ch1 == '/') && (ch2 == '+' || ch2 == '-'))
return false;

// 1+2*3
if ((ch1 == '+' || ch1 == '-') && (ch2 == '*' || ch2 == '/'))
return true;
}

int calc(int num1, int num2, char op){
int ret = 0;
switch (op)
{
case '+': ret = num1 + num2; break;
case '-': ret = num1 - num2; break;
case '*': ret = num1 * num2; break;
case '/': ret = num1 / num2; break;
default:
break;
}
return ret;
}
// 5*((1-2)*(6-7+8*9-(34-12*1)))
// 1-2+3*(4-5)
int main(){
string str;
cin >> str;

for (unsigned int i = 0; i < str.length(); i++){
if (isdigit(str[i])){
string tmp = "";
stringstream ss;
int k;
while (isdigit(str[i])){
tmp += str[i];
i++;
}
i-=1;
ss << tmp;
ss >> k;
stack_num.push(k);
}else{
if (stack_op.empty() || str[i] == '('){
stack_op.push(str[i]);
}else{
if (str[i] == ')'){
while (stack_op.top() != '(')
{
int num1, num2;
if (!stack_num.empty()){
num2 = stack_num.top();
stack_num.pop();
}else{
num2 = 0;
}
if (!stack_num.empty()){
num1 = stack_num.top();
stack_num
a9c6
.pop();
}else{
num1 = 0;
}
char op = stack_op.top();
stack_op.pop();
stack_num.push(calc(num1, num2, op));
}
stack_op.pop(); // 除去stack_op 中的 (
}else{
char ch1 = stack_op.top();
char ch2 = str[i];
if (f(ch1, ch2)){
stack_op.push(str[i]);
}else{
int num2 = stack_num.top();
stack_num.pop();
int num1 = stack_num.top();
stack_num.pop();
int s = calc(num1, num2, stack_op.top());
stack_op.pop();
stack_num.push(s);
stack_op.push(str[i]);
} // end if (f(ch1,ch2))
}
}
}
}

// 清空尾数据
while (!stack_op.empty()){
int num1, num2;
if (!stack_num.empty()){
num2 = stack_num.top();
stack_num.pop();
}else{
num2 = 0;
}
if (!stack_num.empty()){
num1 = stack_num.top();
stack_num.pop();
}else{
num1 = 0;
}
char op = stack_op.top();
stack_op.pop();
stack_num.push(calc(num1, num2, op));
}
cout << stack_num.top() << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: