采用分离编程
先写头文件
#pragma once
#include<iostream>
#include<string>
#include<stack>
using namespace std;
class counter
{
public:
string::size_type get_number_size(string& expr, string::size_type currentPos);
bool is_number(char& c);
void pop_caculate();
int cal_priority(char& c);
void calculate(string& expr);
string expression;
double result;
int number_flag;
stack<double> num_stk;
stack<char> oper_stk;
};
函数库
#include<iostream>
#include<stack>
#include<string>
#include "counter.h"
string::size_type counter::get_number_size(string& expr, string::size_type currentPos)
{
string numbers = "0123456789.";
return expr.find_first_not_of(numbers, currentPos) - currentPos;
}
int counter::cal_priority(char& c) {
if (c == '(') return 0;
else if (c == '+') return 1;
else if (c == '-') return 2;
else if (c == '*') return 3;
else if (c == '/') return 4;
return 0;
}
void counter::pop_caculate() {
double left = 0, right = 0, res = 0;
char oper = oper_stk.top();
right = num_stk.top();
num_stk.pop();
left = num_stk.top();
num_stk.pop();
oper_stk.pop();
if (oper == '+') res = left + right;
else if (oper == '-') res = left - right;
else if (oper == '*') res = left * right;
else if (oper == '/') res = left / right;
num_stk.push(res);
}
bool counter::is_number(char& c) {
string numbers = "0123456789-";
if (numbers.find(c) == string::npos) {
return false;
}
return true;
}
void counter::calculate(string& expr) {
string::size_type size = 0;
double num = 0;
for (string::size_type i = 0; i < expr.size();) {
if (number_flag == 0 && is_number(expr[i])) {
num = stod(expr.substr(i));//stod将字符串转化为double
if (expr[i] == '-') {
++i;
num = -stod(expr.substr(i));
}
size = get_number_size(expr, i);
num_stk.push(num);
i += size;
number_flag = 1;
}
else {
number_flag = 0;
if (oper_stk.empty()) {
oper_stk.push(expr[i]);
}
else if (expr[i] == '(') {
oper_stk.push(expr[i]);
}
else if (expr[i] == ')') {
while (oper_stk.top() != '(') {
pop_caculate();
}
oper_stk.pop();
}
else if (cal_priority(expr[i]) <= cal_priority(oper_stk.top())) {
pop_caculate();
oper_stk.push(expr[i]);
}
else {
oper_stk.push(expr[i]);
}
++i;
}
}
while (!oper_stk.empty()) {
pop_caculate();
}
result = num_stk.top();
cout << "计算结果为:" << result << endl << endl;
cout << "请输入计算表达式:" << endl;
}
主函数
#include<iostream>
#include<string>
#include"counter.h"
using namespace std;
int main()
{
string experssion;
counter c;
cout << "可以实现加减乘除及括号运算" << endl;
cout << "请输入计算表达式:" << endl;
while (cin >> experssion)
{
c.number_flag = 0;
c.calculate(experssion);
}
return 0;
}
分为三个文件然后就可以运行啦