码迷,mamicode.com
首页 > 其他好文 > 详细

简单计算器问题

时间:2015-05-06 09:14:43      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

问题:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值并写出算法。

回答:

#include<iostream>
#include<stack>
#include<string>
using namespace std;
char Precede(char a,char b);
double operate(double a1,char c,double b1);
int main()
{
    stack<double> opnd;
    stack<char> optr;
    string s;
    char theta,c;
    int i,k;
    double a,b;
    while(getline(cin,s),s!="0")
    {
        opnd.push(s[0]-48);
        i=0;
        c=s[++i];
        while(c!=‘\0‘)
        {
            if(c==‘ ‘)
            {
                c=s[++i];
                continue;
            }
            if(c>=‘0‘&&c<=‘9‘)
            {
                if(s[i-1]>=‘0‘&&s[i-1]<=‘9‘)//此处重要,比如32字符是连续的多个不是单个
                {
                    a=opnd.top()*10+c-48;
                    opnd.pop();
                    opnd.push(a);
                }
                else
                opnd.push(c-48);
                c=s[++i];
            }
            else
            {
                if(optr.empty()!=true)
                {
                    switch(Precede(optr.top(),c))//重点:运算符的优先级
                    {
                        case ‘<‘:optr.push(c);c=s[++i];break;//如果前一个运算符比后一个下就进栈
                        case ‘>‘:theta=optr.top();//此处进行运算,并没有进栈,因为我是前面字符和后面字符比较
                                 optr.pop();      //只有前面字符优先级高才运算
                                 a=opnd.top();
                                 opnd.pop();
                                 b=opnd.top();
                                 opnd.pop();
                                 opnd.push(operate(b,theta,a));
                                 break;
                     }
                 }
                else
                {
                    optr.push(c);
                    c=s[++i];
                }
            }
        }
        while(optr.empty()!=true)//因为我先输入数字,可能最后剩下运算符没有处理
        {
             theta=optr.top();
             optr.pop();
             a=opnd.top();
             opnd.pop();
             b=opnd.top();
             opnd.pop();
             opnd.push(operate(b,theta,a));
        }
        printf("%.2lf\n",opnd.top());
    }
    return 0;
}
char Precede(char a,char b)//比较运算符的优先级
{
    if(a==‘+‘||a==‘-‘)
    {
        switch(b)
        {
            case ‘+‘:
            case ‘-‘:return ‘>‘;break;
            case ‘*‘:
            case ‘/‘:return ‘<‘;break;
        }
    }
    if(a==‘*‘||a==‘/‘)
    return ‘>‘;
}
double operate(double a,char c,double b)//运算
{
    switch(c)
    {
        case ‘+‘:return (a+b);break;
        case ‘-‘:return (a-b);break;
        case ‘*‘:return a*b;break;
        case ‘/‘:return a/b;break;
    }
}

简单计算器问题

标签:

原文地址:http://www.cnblogs.com/benchao/p/4480838.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!