双目运算模板

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,k,t;
int ret[maxn];
char a[maxn],b[maxn],c[maxn];
void gao()
{
    int top1=0,top2=0;
    for(int i=0;a[i];i++)
    {
        if(a[i]==‘ ‘)continue;
        if(a[i]==‘(‘)c[++top2]=a[i];
        else if(a[i]==‘)‘)
        {
            while(c[top2]!=‘(‘)b[top1++]=c[top2--];
            top2--;
        }
        else if(a[i]==‘|‘)
        {
            while(top2&&c[top2]!=‘(‘)b[top1++]=c[top2--];
            c[++top2]=a[i];
        }
        else if(a[i]==‘^‘)
        {
            while(top2&&c[top2]!=‘(‘&&c[top2]!=‘|‘)b[top1++]=c[top2--];
            c[++top2]=a[i];
        }
        else if(a[i]==‘&‘)
        {
            while(top2&&c[top2]!=‘(‘&&c[top2]!=‘^‘&&c[top2]!=‘|‘)b[top1++]=c[top2--];
            c[++top2]=a[i];
        }
        else if(a[i]==‘+‘||a[i]==‘-‘)
        {
            while(top2&&c[top2]!=‘(‘&&c[top2]!=‘&‘&&c[top2]!=‘^‘&&c[top2]!=‘|‘)b[top1++]=c[top2--];
            c[++top2]=a[i];
        }
        else if(a[i]==‘*‘||a[i]==‘/‘)
        {
            while(top2&&c[top2]!=‘(‘&&c[top2]!=‘+‘&&c[top2]!=‘-‘&&c[top2]!=‘&‘&&c[top2]!=‘^‘&&c[top2]!=‘|‘)b[top1++]=c[top2--];
            c[++top2]=a[i];
        }
        else
        {
            while(a[i]>=‘0‘&&a[i]<=‘9‘)b[top1++]=a[i],i++;
            i--;
            b[top1++]=‘#‘;
        }
    }
    while(top2)b[top1++]=c[top2--];
    b[top1]=0;
}
int main()
{
    int i,j;
    while(gets(a))
    {
        gao();
        int top=0;
        for(i=0;b[i];i++)
        {
            if(b[i]>=‘0‘&&b[i]<=‘9‘)
            {
                int num=0;
                while(b[i]>=‘0‘&&b[i]<=‘9‘)num=num*10+b[i]-‘0‘,i++;
                i--;
                ret[++top]=num;
            }
            else if(b[i]==‘+‘)
            {
                ret[top-1]+=ret[top];
                top--;
            }
            else if(b[i]==‘-‘)
            {
                ret[top-1]-=ret[top];
                top--;
            }
            else if(b[i]==‘*‘)
            {
                ret[top-1]*=ret[top];
                top--;
            }
            else if(b[i]==‘/‘)
            {
                ret[top-1]/=ret[top];
                top--;
            }
            else if(b[i]==‘&‘)
            {
                ret[top-1]&=ret[top];
                top--;
            }
            else if(b[i]==‘^‘)
            {
                ret[top-1]^=ret[top];
                top--;
            }
            else if(b[i]==‘|‘)
            {
                ret[top-1]|=ret[top];
                top--;
            }
            else
            {
                continue;
            }
        }
        cout<<ret[1]<<endl;
    }
    return 0;
}
时间: 2024-10-21 23:58:36

双目运算模板的相关文章

大数运算模板

大整数加法 /* 大整数加法 调用方式:add(a, b); 返回类型:string */ string add(string a, string b) { string s; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int i = 0; int m, k = 0; while(a[i] && b[i]) { m = a[i] - '0' + b[i] - '0' + k; k = m / 10; s += (m

大整数运算模板总结

大整数运算模板总结. 大整数结构体表示 整型数组从低位到高位顺序存储每一位数字,另外需要存储数字的长度. struct bign { int d[1000]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; } }; 大整数输入 一般通过字符串输入. bign Change(string str)//输入字符串转大整数 { bign a; a.len = str.length(); for (int i = 0; i < a.len; i++

快速幂运算模板

ll pow(ll a,ll b) //long long型 { ll ans=1; while(b!=0) { if(b%2==1) //if(b&1) ans=ans*a%mod;//如果是奇数次幂,因为b下面是除以2操作,会少一次乘,这里要提前乘上去. a=a*a%mod;//快速幂,每一次是上一次的平方倍 b=b/2; } return ans; } 分析: 将指数b看成二进制,b%2==1即判断当前b二进制最低位是否为1,是则将当前底数a与累积ans相乘,否则跳过.在每次循环中都将底数

快速运算模板(未完待续)

快速运算题目(持续更新) \(1.\) \(Raising\) \(Modulo\) \(Numbers\) 快速幂 细节:注意返回答案前取模. $View$ $Code$ inline long long readl() { long long ret=0,f=1; char ch=getchar(); while(ch>'9'||ch='0'&&ch>=1; } return ans%mod; } long long a,b,p; int main() { a=readl(

大数运算模板(高精度)

/*大数加法*/ # include<stdio.h> # include<string.h> # include<malloc.h> void add(char* a,char* b,char* c) { int i,j,k,max,min,n,temp; char *s,*pmax,*pmin; max=strlen(a); min=strlen(b); if (max<min) { temp=max; max=min; min=temp; pmax=b; p

分式运算模板

ll gcd(ll a,ll b) { if(b==0) { return a; }else { return gcd(b,a%b); } } ll ABS(ll x) { return x<0 ? -x : x; } struct F { ll num,den;// fenzi -> num fenmu-> den F(ll num=0,ll den=1) { if(den<0) num=-num,den=-den; ll g = gcd(ABS(num),den); this-

单目运算的优先级高于双目运算

原文地址:https://www.cnblogs.com/WLCYSYS/p/12112844.html

C的|、||、&amp;、&amp;&amp;、异或、~、!运算

位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符.     位运算符的优先级从高到低,依次为~.&.^.|, 其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&) 

巧妙运用位运算

位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符. 位运算符的优先级从高到低,依次为~.&.^.|,     其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&)