标签:rem 出现 out res return 最小 用两个 伪代码 char
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std;
char s[1000];
int i; // 字符数组的下标
/* 字符转数字 */
double Translation(int & i)
{
double integer = 0.0; // 整数部分
double remainder = 0.0; // 余数部分
while (s[i] >= ‘0‘ && s[i] <= ‘9‘)
{
integer *= 10;
integer += (s[i] - ‘0‘);
i++;
}
if (s[i] == ‘.‘)
{
i++;
int c = 1;
while (s[i] >= ‘0‘ && s[i] <= ‘9‘)
{
double t = s[i] - ‘0‘;
t *= pow(0.1, c);
c++;
remainder += t;
i++;
}
}
return integer + remainder;
}
/* 返回运算符级别 */
int GetLevel(char ch)
{
switch (ch)
{
case ‘+‘:
case ‘-‘:
return 1;
case ‘*‘:
case ‘/‘:
return 2;
case ‘(‘:
return 0;
case ‘#‘:
return -1;
};
}
/* 对两个数进行运算 */
double Operate(double a1, char op, double a2)
{
switch (op)
{
case ‘+‘:
return a1 + a2;
case ‘-‘:
return a1 - a2;
case ‘*‘:
return a1 * a2;
case ‘/‘:
return a1 / a2;
};
}
/* 利用两个栈进行模拟计算 */
double Compute()
{
stack<char> optr; // 操作符栈
stack<double> opnd; // 操作数栈
optr.push(‘#‘);
int len = strlen(s);
bool is_minus = true; // 判断‘-‘是减号还是负号
for (i = 0; i < len;)
{
//1. 负号
if (s[i] == ‘-‘ && is_minus) // 是负号
{
opnd.push(0);
optr.push(‘-‘);
i++;
}
//2. 是右括号 )
else if (s[i] == ‘)‘)
{
is_minus = false;
i++;
while (optr.top() != ‘(‘)
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.pop(); // 删除‘(‘
}
//3. 数字
else if (s[i] >= ‘0‘ && s[i] <= ‘9‘)
{
is_minus = false;
opnd.push(Translation(i));
}
//4. ( 左括号
else if (s[i] == ‘(‘)
{
is_minus = true;
optr.push(s[i]);
i++;
}
//5. + - * / 四种
else
{
while (GetLevel(s[i]) <= GetLevel(optr.top()))
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.push(s[i]);
i++;
}
}
while (optr.top() != ‘#‘)
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
return opnd.top();
}
int main()
{
while (cin >> s)
cout << "结果为:" << Compute();
cout << endl << endl;
}
标签:rem 出现 out res return 最小 用两个 伪代码 char
原文地址:https://www.cnblogs.com/78tian/p/8824151.html