初级计算器算法(栈处理运算符优先级)

运算符的先后计算可以用栈来保存,分别有几种情况

1,当前1+2-3即优先级相同,那么可以先算前一个。

2,1+2*3这种情况我不做处理(注:我每次只选择是否处理上一个)

3,2*8+2这种情况计算前一个。

小细节太多,不说太多,有兴趣的同学留言。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;

stack<int>num,opt;
int deal()
{
    int now=opt.top();opt.pop();
    int last=opt.top();opt.pop();
    if(last/2<now/2)
    {
        opt.push(last),opt.push(now);
        return 1;
    }
    int a=num.top();num.pop();
    int b=num.top();num.pop();
    int c=num.top();num.pop();
    if(last==0)num.push(c+b);
    else if(last==1)num.push(c-b);
    else if(last==2)num.push(c*b);
    else if(last==3&&b)num.push(c/b);
    else return 2;
    num.push(a);opt.push(now);
    return deal();
}
int solve(char* ss)
{
    int len=strlen(ss),cur=0;
    int tmp=0;
    while(cur<len&&ss[cur]!=' ')
            if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
            else return false;
    num.push(tmp);opt.push(-2);
    while(cur<len)
    {
        if(ss[++cur]=='+')opt.push(0);
        else if(ss[cur]=='-')opt.push(1);
        else if(ss[cur]=='*')opt.push(2);
        else if(ss[cur]=='/')opt.push(3);
        else return 0;
        if(ss[++cur]==' ')cur++;
        else return 0;
        tmp=0;
        while(cur<len&&ss[cur]!=' ')
            if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
            else return 0;
        num.push(tmp);
        if(deal()==2)return 2;
    }
    opt.push(0);num.push(0);deal();
    return 1;
}
int getans()
{
    num.pop();
    return num.top();
}
int main()
{
    char ss[200];
    while(gets(ss))
    {
        int key=solve(ss);
        if(key==1)printf("%d\n",getans());
        else if(key==0)printf("格式错误\n");
        else printf("逻辑错误(被除数可能为零?)\n");
        while(!num.empty())num.pop();
        while(!opt.empty())opt.pop();
    }
    return 0;
}
时间: 2024-10-07 06:47:51

初级计算器算法(栈处理运算符优先级)的相关文章

模拟初级计算器 单调栈实现

题意:求解一串不出现数学公式只含'+','-','*','/', '(' , ')'的计算表达式,输出结果: 其中'/'是带小数的除法.并且输入的数值位double型,若是输入的运算符有误,或者出现除0错误,则直接输出intput error. 输入时除数值之间不能出现空格外,其他地方均能有空格.并且3(...)看成为3*(); 0.5也可以输入为.5; 注意:代码中目前没有加入识别是减号还是符号的处理:所以只能处理非负整数之间的运算: 实现细节:以运算符的优先级来设置一个优先级(数学意义)递减

算法-栈,队列

常见的栈与队列算法题 1.使用队列实现栈 2.使用栈实现队列 3.包含最小值函数的栈 4.合法的出栈序列 5.简单计算器 1.队列实现栈 class MyStack { public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { int len=data.size(); data.push(x); while(len>0

浅谈算法和数据结构: 五 优先级队列与堆排序

转载自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是

Python核心编程基础教程之Python运算符、运算符优先级、表达式简介--20150717

Python核心编程基础教程之Python运算符.运算符优先级.表达式简介 1.Python运算符与表达式: (1)认识Pyhton运算符1:什么是运算符 在Python运算中,有时候我们需要对一个或者多个数字或者一个或者多个字符串进行运算操作,*,+ (2)认识Pyhton运算符2:运算符有哪些以及运算符的使用方法 + :加 - :减 * :乘 / :除 ** :幂 < :小于 > :大于 != :不等于 // :求相除的整数部分 % :求相除的余数部分 & :按位与 | :按位或

初级排序算法1-定义排序规则

初级排序算法-定义排序规则 排序就是将一组对象按照某种逻辑序列重新排列的过程. Table of contents 介绍 为什么学它 排序算法类的模板 验证 性能评估 介绍 现在计算机的广泛使用使得数据无处不在,而整理数据的第一步通常就是进行排序 所有的计算机都实现了各种排序算法以供系统和用户使用 为什么学它 即使你只是使用标准库中的排序算法,学习排序算法仍然有三大实际意义 对排序算法的分析将有助于你全面理解比较算法性能的方法 类似的技术也能有效解决其他类型的问题 排序算法常常是我们使用算法解决

C语言备忘录——运算符优先级

丢脸啊,今天写一道算法题,第一次没写对.改了半天愣是没看出来错哪,后面说出了一下过程,突然发现是运算符优先级惹得祸 if (!num % 2){ …… },!的运算优先级高于%,啊啊啊,丧心病狂我找了十来分钟,把老脸都给丢尽了.为了避免这种低级错误, 所以写下这篇博客巩固一下运算符优先级. 不叨叨,直接上表. 优先级 运算符 名称 使用方法 运算顺序 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表达式)/函数名(形参表)   . 成员选择(对象) 对象.成员名  

C程序设计(3)-运算、运算符优先级、转义字符

运算: 取余运算%:两侧必须为整型数,x%10:得到x的个位数: 除法运算/:任意两整数相除,结果为整数:两边有一个为浮点数,结果为浮点数: x/(10^(n-1))%10:得到x对应的n位数(n:个.十.百.千.万…),对应代码:{(x/(int)(pow(10,n-1))%10;}: log10(x)+1:得到x的位数,对应代码:{(int)log10(x)+1;}: 截取数num第low~high位:{for(int i = 0; i < high - low +1; i++){res +

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

运算符优先级

1        算术运算符       单目 >双目 >三目 2        关系运算符 3        逻辑运算符      &&高于||      !算术还高高 一共有十五个优先级: 1   ()  []  .  -> 2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 3   * / % 4   + - 5   >> << 6   > >= <