基于C++STL的计算器实现
实现一个简单的计算器,支持运算符:+ , - , * , / , ( )
完整代码:
#include <iostream>
#include <vector>
#define max 100
using namespace std;
//操作符优先级设置
int getprior(char x)
{
if (x == '#') return 0;
if (x == '+' || x == '-') return 1;
if (x == '*' || x == '/') return 2;
if (x == '(' || x == ')') return 3;
}
int sign = 0;//标记开头是否为负数
//优先级比较
int compare(char x, char j)
{
if (j < 48)
{
if (getprior(x) > getprior(j) && x == '(') return 1;//“(”括号特殊处理
if (getprior(x) > getprior(j)) return 0;//栈内优先级高
if (x == '#' && j == '-') //开头负号处理
{
if (sign == 0) return 4;
else return 1;
}
if (getprior(x) < getprior(j) && j == ')') return 0;//“)”括号处理
if (getprior(x) < getprior(j)) return 1;//栈内优先级低
if (getprior(x) == getprior(j) && j == '#') return 2;//删号
if (getprior(x) == getprior(j) && j == ')') return 2;//删号
if (getprior(x) == getprior(j)) return 0;//优先级相同但顺序不同
}
else return 3;//数字
}
int main()
{
//输入字符串
char cun[max] = { '0' };
char x1 = '#';
int n = 0;
while (true)//输入停止符
{
cin >> x1;
cun[n] = x1;
n++;
if (x1 == '=') break;
}
if (cun[n - 1] == 61) cun[n - 1] = cun[n - 1] - 26;
vector<int> num;
vector<char> opt;
opt.push_back('#');
for (int i = 0; i < n; i++)
{
char c = opt.back();//暂存原来符号栈中的符号
char t = cun[i];
int k = compare(c, t);
if (k == 1)//栈内优先级低输入
{
opt.push_back(t);
}
if (k == 0)//栈内优先级高计算
{
int temp01 = num.back();
num.pop_back();
int temp02 = num.back();
num.pop_back();
switch (c)
{
case '+':
num.push_back(temp01 + temp02);
break;
case '-':
num.push_back(temp02 - temp01);
break;
case '*':
num.push_back(temp01 * temp02);
break;
case '/':
num.push_back(temp02 / temp01);
break;
}
opt.pop_back();//清除使用过的符号
i--;
continue;
}
if (k == 2)//相同符号执行删除两次
{
opt.pop_back();
}
if (k == 3)//多位数设置+char型数据转化为int型
{
int p = cun[i] - '0';
int sum = p;
while(cun[i + 1] >= 48)
{
int q = cun[i + 1] - '0';
sum = sum * 10 + q;
i++;
}
if (sign == 1) sum = -sum;
num.push_back(sum);
sign = 2;//变为2
}
if (k == 4) sign = 1;//标记为负数
}
cout << num.back();
num.clear();
return 0;
}
//测试数据
// 45-(34-4)*2 4-(1-1) -45/(9-4)
运行展示: