博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单计算器问题
阅读量:5290 次
发布时间:2019-06-14

本文共 1540 字,大约阅读时间需要 5 分钟。

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

回答:

#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;
    }
}

转载于:https://www.cnblogs.com/benchao/p/4480838.html

你可能感兴趣的文章
【H3 BPM工作流程管理产品小故事】第六篇 条件可见与条件必填
查看>>
git 打标签并推送tag到托管服务器
查看>>
6.3 OrderBy 优化
查看>>
软件工程基础-结对项目作业
查看>>
C#获取本地txt文件后Json的解析与取值
查看>>
python + selenium 模块封装及参数化
查看>>
清理脚本
查看>>
在普通类中调用service
查看>>
个人技能总结10:微信开发
查看>>
Springboot整合pagehelper分页
查看>>
迅为7寸安卓系统触控一体机提供操作例程【目录】
查看>>
Ice异步程序设计----AMI,AMD
查看>>
windows下安装opencv
查看>>
JavaScript-jQuery报TypeError $(...) is null错误(jQuery失效)解决办法
查看>>
open live writer
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
SAP销售模块塑工常见问题和解决方案(自己收藏)
查看>>
事后诸葛亮博客
查看>>
TC SRM 593 DIV1 250
查看>>