用到了中缀转后缀以及后缀表达式的计算
直接贴代码~:
-
#include "stdafx.h"
-
#include <iostream>
-
#include "Calculator.h"
-
-
//构造函数
-
Calculator::Calculator()
-
{
-
m = new char[100];
-
}
-
-
//析构
-
Calculator::~Calculator()
-
{
-
}
-
//判断是不是数字
-
bool Calculator::isnum(char a)
-
{
-
if ((a >= '0') && (a <= '9'))
-
return true;
-
else
-
return false;
-
}
-
//判断是不是左括号
-
bool Calculator::isleft(char a)
-
{
-
if ((a == '('))
-
return true;
-
else
-
return false;
-
}
-
//判断是不是右括号
-
bool Calculator::isright(char a)
-
{
-
if ((a == ')'))
-
return true;
-
else
-
return false;
-
}
-
//判断是不是符号
-
bool Calculator::isOperator(char a)
-
{
-
if ((a == '+') || (a == '-') || (a == '*') || (a == '/'))
-
return true;
-
else
-
return false;
-
}
-
//比较符号的优先级
-
int Calculator::priority(char a)
-
{
-
if ((a == '+') || (a == '-'))
-
return 1;
-
-
else if ((a == '*') || (a == '/'))
-
return 2;
-
else
-
return 0;
-
}
-
//根据符号进行运算
-
int Calculator::express(int left, int right, char op)
-
{
-
int ret = 0;
-
-
switch (op)
-
{
-
case '+':
-
ret = left + right;
-
break;
-
case '-':
-
ret = left - right;
-
break;
-
case '*':
-
ret = left * right;
-
break;
-
case '/':
-
ret = left / right;
-
break;
-
default:
-
break;
-
}
-
-
return ret;
-
}
-
//将char转为int
-
int value(char c)
-
{
-
return (c - '0');
-
}
-
//总体计算函数
-
int Calculator::ret(char* a)
-
{
-
int i = 0;
-
int j = 0;
-
stack<char> n;
-
stack<int> h;
-
if (a == NULL)
-
{
-
cout << "Something wrong!..." << endl;
-
return 0;
-
}
-
while (a[i] != '\0')
-
{
-
if (isnum(a[i]))
-
{
-
m[j++] = a[i];
-
}
-
else if (isOperator(a[i]))
-
{
-
while ((n.size() != 0) && (priority(a[i]) <= priority(n.top())))
-
{
-
m[j++] = n.top();
-
n.pop();
-
}
-
n.push(a[i]);
-
}
-
else if (isleft(a[i]))
-
{
-
n.push(a[i]);
-
}
-
else if (isright(a[i]))
-
{
-
while ((n.size() != 0) && (!isleft(n.top())))
-
{
-
m[j++] = n.top();
-
n.pop();
-
}
-
n.pop();
-
}
-
else
-
{
-
cout << "Invalid expression!1" << endl;
-
break;
-
}
-
i++;
-
}
-
while ((n.size() > 0) && (a[i] == '\0'))
-
{
-
m[j++] = n.top();
-
n.pop();
-
}
-
m[j] = '\0';
-
///前半部分进行中缀转后缀,下面是后缀算数。
-
-
i = 0;
-
j = 0;
-
int right = 0;
-
int left = 0;
-
int result = 0;
-
int ret;
-
-
while (m[i] != '\0')
-
{
-
if (isnum(m[i]))
-
{
-
j = value(m[i]);
-
h.push(j);
-
}
-
else if (isOperator(m[i]))
-
{
-
right = h.top();
-
h.pop();
-
left = h.top();
-
h.pop();
-
result = express(left, right, m[i]);
-
h.push(result);
-
}
-
else
-
{
-
cout << "Invalid expression!2" << endl;
-
break;
-
}
-
i++;
-
}
-
if ((h.size() == 1) && (m[i] == '\0'))
-
{
-
ret = h.top();
-
h.pop();
-
}
-
else
-
{
-
cout << "Invalid expression!2" << endl;
-
ret = 0;
-
}
-
delete m;
-
return ret;
-
}