// 计算器二.cpp : 定义控制台应用程序的入口点。
//
include “stdafx.h”
include
include
include
using namespace std;
char precede(char s, char t)
{
switch (s)
{
case’+’:
case’-‘:
{
if (t == ‘(’ || t== ‘*’ || t == ‘/’)
return ‘<’;
else
return ‘>’;
}
break;
case’*’:
case’/’:
{
if (t == ‘(‘)
return ‘<’;
else
return ‘>’;
}
break;
case’(‘:
{
if (t == ‘)’)
return ‘=’;
else
return ‘<’;
}
break;
case’)’:
return ‘>’;
break;
case’#’:
{
if (t == ‘#’)
return ‘=’;
else
return ‘<’;
}
break;
}
}
double cal2(char ope, double x, double y)
{
switch (ope)
{
case ‘+’:
return x + y;
case ‘-‘:
return x - y;
case’*’:
return x*y;
case’/’:
return x / y;
}
}
double fenli(string s, int& i)
{
double result = 0;
while ('0'<= s[i] &&s[i]<= '9')
{
int key = s[i] - '0';
result = result * 10 +key;
i++;
}
if (s[i] == '.')
{
double jinzhi = 0.1;
i++;
while ('0' <= s[i] &&s[i]<= '9')
{
result += (s[i] - '0')*jinzhi;
jinzhi /= 10;
i++;
}
}
return result;
}
double cal(string s)
{
stack number;
stack opera;
int i = 0;
while(true)
{
if (‘0’ <= s[i] &&s[i]<= ‘9’)
{
double num = fenli(s, i);
//i–;
number.push(num);
}
else
{
if (opera.empty())
{
opera.push(s[i]);
i++;
}
else
{
switch (precede(opera.top(), s[i]))
{
case’<’:
opera.push(s[i]);
i++;
break;
case’>’:
{
double num2 = number.top();
number.pop();
double num1 = number.top();
number.pop();
double result = cal2(opera.top(), num1, num2);
opera.pop();
number.push(result);
if (number.size() == 1)
return number.top();
break;
}
case'=':
{
opera.pop();
}
}
}
}
}
return number.top();
}
int main()
{
string s =”3*12+0+34*(1+1)/2#”;
double d=cal(s);
cout << d << endl;
return 0;
}