先说一下实现思路,使用两个栈,一个存放数字,一个存放运算符。这样比较运算符和取出运算的数字都非常方便。再者,在压入栈的过程中,把要压入的运算符和前一个运算符进行比较,如果优先级小于或者等于,就要将前一个运算符进行计算。
ps:支持带括号带负数四则运算。
#include
#include
#include
using namespace std;
stack num_stk;
stack oper_stk;
string experssion;
double result;
int number_flag;
void pop_caculate();
int cal_priority(char c);
string::size_type get_number_size(string &expr,string::size_type currentPos);
bool is_number(char c);
void caculate(string expr);
int main()
{
cout experssion) {
number_flag = 0;
caculate(experssion);
}
}
/*
* get number length from currentPos of string expr
*/
string::size_type get_number_size(string &expr,string::size_type currentPos)
{
string numbers = "0123456789.";
return expr.find_first_not_of(numbers,currentPos) - currentPos;
}
/*
* char c is number?
*/
bool is_number(char c)
{
string numbers = "0123456789-";
if (numbers.find(c) == string::npos) {
return false;
}
return true;
}
/*
* the main caculate method
*/
void caculate(string expr)
{
string::size_type size = 0;
double num = 0;
for (string::size_type i=0;i |