c++实现计算器的方法和代码
中缀表达式转后缀表达式,考试大现在就用这个方式再实现计算器..
表达式一旦转换成后缀表达式再进行计算就简单的不得了.Examda遇到一个符号就弹出离他最近的两个操作数然后进行这个操作符指定的运算就ok了...运算完成后压栈继续扫描,依次重复...等到操作符没有了.所有的运算也就结束了.结果也就出来了...不必再判断优先级的什么的了.括号什么的也一并省略...
其实在中缀转后缀的时候就可以进行计算,表达式扫描完成,计算完成.
把代码直接复制..修改..
opt.push('#');
int len = exp.length();
for (int i = 0; i < len;)
{
char ch = exp.at(i);
if (isalnum(ch))
{
long num = 0;
while (isalnum(ch)) //转换为整数
{
num = (ch-'0') + num*10;
if (++i >= len)
break;
ch = exp.at(i);
}
opd.push(num); // 操作数入栈
}
else // 操作符就判断并压栈
{
if (ch == '(') // 左括号直接压栈
opt.push(ch);
else if (ch == ')') // 有括号就弹栈到直到遇到左括号
{
ch = opt.top(); // 取得栈顶操作符
while(ch != '(') // 直到弹出左括号
{
OP(ch);
opt.pop();
ch = opt.top();
}
opt.pop(); // 弹出左括号
}
else
{
int thisPri = GetPri(ch); // 当前操作符优先级
char prevOpt = opt.top(); // 上一个操作符
int prevPri = GetPri(prevOpt); // 上一个操作符优先级
while (thisPri { //输出栈中的操作符直到遇到比当前的操作符优先级更低的
OP(prevOpt);
opt.pop(); // 输出后就弹出
prevOpt = opt.top();
prevPri = GetPri(prevOpt);
}
opt.push(ch); //当前操作符压栈
}
i++;
}
}
char ch = opt.top(); // 表达式扫描完后把栈中剩余的操作符全部输出
while (ch != '#')
{
OP(ch);
opt.pop();
ch = opt.top();
}
提示:输出的地方换成了运算 OP(const char &ch); 完成运算
要明白一点.表达式扫描完成,有可能操作符是压栈了而未进行运行,(这由具体的表达式决定),因此最后要把操作符栈弹空,完成全部的运算....则此时操作数栈中的的一个数就是运行结果了.
函数OP.实现如下. 参数 ch 是操作符
void Caculator::OP(const char &ch)
{
long RightOperand = opd.top();
opd.pop();
long LeftOperand = opd.top(); // 这两个操作数的顺序不能错
opd.pop();
switch(ch)
{
case '+':
LeftOperand += RightOperand;
break;
case '-':
LeftOperand -= RightOperand;
break;
case '*':
LeftOperand *= RightOperand;
break;
case '/':
if (RightOperand == 0) // 除数为 0
{
cout
0条评论