首页 > 其他分享 >四则混合运算

四则混合运算

时间:2023-11-11 09:55:50浏览次数:27  
标签:case obj3 obj2 return 运算 混合 char 括号

#include <iostream>
#include<stack>
#include<deque>
#include<string>
using namespace std;
//C++混合四则运算
int pri(char c)//标识运算符优先级
{
    switch(c)
    {
        case '+':
        case '-':return 0;break;
 
        case '*':
        case '/':
        case '%':return 1;break;
 
        case '('://基本上用不到括号的优先级判断
        case ')':return -1;break;
    }
}
 
bool ispunc(char c)//判断是否为括号
{
    if(c=='('||c==')') return true;
    else return false;
}
 
void check(char c,stack<char>&obj2,deque<char>&obj3)//当obj1中出列的是运算符时,判断优先级顺序,将运算符入列obj3.
{
    if(obj2.empty())
    {
        obj2.push(c);
        return ;
    }
    if(ispunc(c))//如果是括号
    {
       if(c=='(') obj2.push(c);//如果是左括号直接压栈
       else{
            while(obj2.top()!='(')//如果是右括号,则出栈obj2直到遇见左括号为止,匹配括号
            {
               obj3.push_back(obj2.top());
               obj2.pop();
            }
             obj2.pop();//知道括号是不入队列obj3的(也就是说括号不存在后序序列的)
           }
    }
    else
    {
       if(pri(c)<=pri(obj2.top())) //如果不是括号,判断它与栈顶运算符的优先级优先级高入栈,否 
       {                                                 // 则出栈
          obj3.push_back(obj2.top());
          obj2.pop();
          check(c,obj2,obj3);
       }
        else obj2.push(c);
    }
}
 
void transf(deque<char>&obj1,stack<char>&obj2,deque<char>&obj3)
{
    while(!obj1.empty()) //利用栈obj2来将中序序列转换为后序序列obj3
    {
         char temp=obj1.front();
         obj1.pop_front();
         if(temp>='0'&&temp<='9')
         {
             obj3.push_back(temp);
         }
         else
            check(temp,obj2,obj3);
    }
    while(!obj2.empty())
    {
        obj3.push_back(obj2.top());
        obj2.pop();
    }
}
 
void calcu(deque<char>&obj3)//利用逆波兰表达式求值
{
    stack<int>temp;
    while(!obj3.empty())
    {
        char fc=obj3.front();
        obj3.pop_front();
        if(fc>='0'&&fc<='9') temp.push(fc-'0');//遇见数字入栈
        else  //遇见运算符,取出栈顶两个元素(与运算符操作数匹配,如果带有负号那么则取出一个)
        {
            int one=temp.top();
            temp.pop();
            int two=temp.top();
            temp.pop();
            switch(fc) //将运算后的结果压入栈中
            {
                case '+':{temp.push(two+one);break;}//注意操作数two在前
                case '-':{temp.push(two-one);break;}
                case '*':{temp.push(two*one);break;}
                case '/':{temp.push(two/one);break;}
                case '%':{temp.push(two%one);break;}
            }
        }
    }
    cout<<"The result is:"<<temp.top()<<endl;//取最后栈中唯一元素作为运算结果
    temp.pop();
}
 
int main()
{
    stack<char>obj2;
    deque<char>obj1,obj3;
    string str;
    cin>>str;
        for(int i=0;i<str.size();++i)
            obj1.push_back(str.at(i));
    transf(obj1,obj2,obj3);
    calcu(obj3);
    return 0;
}

 

标签:case,obj3,obj2,return,运算,混合,char,括号
From: https://www.cnblogs.com/w6826301/p/17825544.html

相关文章

  • cf1325D. Ehab the Xorcist(位运算trick)
    https://codeforces.com/contest/1325/problem/D有一个非常经典的结论a+b=(a^b)+2(a&b)这个题就可以往上面靠,首先我们观察一下,对于两个数的情况,如果(v-u)mod2=1,必然无解,试着将它扩展一下,也是对的,因为最低一位没有进位。可以确定的是ans<=3仿照上面的式子,令a=u,b=c=((a+b......
  • Python七种运算符及其优先级
    例:a=10,b=201、算术运算符运算符描述实例+加-两个对象相加a+b输出结果30-减-得到负数或是一个数减去另一个数a-b输出结果-10*乘-两个数相乘或是返回一个被重复若干次的字符串a*b输出结果200/除-x除以yb/a输出结果2%取模-返......
  • iOS项目(Swift),使用Flutter进行混合开发
    一、创建flutter_module先创建fluttermodule项目,参考官方文档,先cd至目标文件夹,执行命令为fluttercreate--templatemoduleflutter_module创建成功后,打开flutter_module项目,打开pubspec.yaml文件,添加所需的依赖 执行命令,更新依赖。执行 flutterrun 命令,生成po......
  • 高斯混合模型GMM实现
    ​ (1)以下matlab代码实现了高斯混合模型:function[Alpha,Mu,Sigma]=GMM_EM(Data,Alpha0,Mu0,Sigma0)%%EM迭代停止条件loglik_threshold=1e-10;%%初始化参数[dim,N]=size(Data);M=size(Mu0,2);loglik_old=-realmax;nbStep=0;Mu=Mu0;......
  • C#语法中一个问号(?)和两个问号(??)的运算符
    (1)、C#语法中一个个问号(?)的运算符是指:可以为null的类型。 (2)、C#语法中两个问号(??)的运算符是指null合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null。           ?? 运算符称为null合并运算符,用于定义可以为null值的类型和引用类......
  • 开发者APP应用程序混合开发和原生开发的区别
    Hello,各位同学们好,我是咕噜铁蛋!随着移动应用市场的蓬勃发展,App开发成为越来越多开发者和企业的关注焦点。在App开发过程中,我们常常听到两种开发方式:原生开发和混合开发。今天铁蛋将和大家深入探讨这两种开发方式的区别,以帮助开发者更好地选择适合自己项目需求的开发方式。一、概念......
  • js小数运算出现多位小数如何解决
    为什么操作小数会出现误差?浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制; 而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差......
  • Shell中的数值运算
    使用expr、$[]、let等整数运算工具:进行四则运算及求模结果使用bc实现小数运算操作h1整数运算工具1.1使用expr命令乘法操作应采用\*转义,避免被作为Shell通配符;参与运算的整数值与运算操作符之间需要以空格分开,引用变量时必须加$符号。首先随便定义变量比如a=10,b=20,然后计算a与b......
  • SQL Server 2005透视表运算符PIVOT应用示例
    SQLServer2005行列转换 有用SQL写过交叉报表的,往往都比较头痛,还好现在SQL2005中提供了新的PIVOT操作符,可以很简单地写出交叉数据查询。正好前两天在研究ORACLE最新的11G版本提供的新特性,发现ORACLE11G也同样推出这个新PIVOT,而且语法格式也几乎是一样的,呵,看来这些主流的数据库都......
  • 赋值运算符,比较运算符,逻辑运算符的应用
    print('-----------赋值运算------------')a=20b=30a=a+b#赋值运算:此处的a是经过20+30后再次赋值给aprint(a)#运行接轨a=50a+=b#这里的运算相当于a=a+b其运算结果为50+30=80print(a)#结果为80a-=b#这里的运算相当于a=a-b其运算结果为80-30......