首页 > 其他分享 >I. 匪石不想计算(栈运算,大一期末考核)

I. 匪石不想计算(栈运算,大一期末考核)

时间:2024-09-18 18:46:31浏览次数:1  
标签:运算 int 匪石 num 期末 st 大一 Mod num1

题目来源:https://codeforces.com/gym/547381/problem/I
//
题意:给出+,-,^三种运算,包含括号,得出结果。
//
思路:“网上看的转为后缀表达式,然后栈模拟,没写出来,后面看的zzh的代码。”用两个栈来模拟,一个存数字,一个存运算符号。
1:如果碰到了数字,入num栈。
2:碰到),一直运算st栈中的运算符号,直到碰到(。
3:碰到运算符号,且栈顶运算符号优先级>=当前运算符号,进行运算。
//
题解:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Mod=1e9+7;
stack<int>num;//存数字
stack<char>st;//存运算符号

int qmi(int a,int b){
    int ans=1;
    while(b){
        if(b&1){ans=ans*a%Mod;}
        a=a*a%Mod;
        b>>=1;
    }
    return ans%Mod;
}

void dot(){
    int num1=num.top();num.pop();
    int num2=num.top();num.pop();
    char op=st.top();st.pop();
    if(op=='+'){num1=(num1+num2)%Mod;}
    else if(op=='*'){num1=num1*num2%Mod;}
    else if(op=='^'){num1=qmi(num2,num1)%Mod;}
    num.push(num1);
    return;
}

void solve(){
    while(!num.empty()){num.pop();}
    while(!st.empty()){st.pop();}//init

    map<char,int>level;
    level['+']=1,level['*']=2,level['^']=3;//运算优先级
    string s;
    cin>>s;
    for(int i=0;i<s.length();i++){
        auto &it=s[i];
        if(isdigit(it)){//数字
            int cnt=0;
            while(i<s.length()&& isdigit(s[i])){
                cnt=cnt*10+(s[i]-'0');
                i++;
            }
            i--;
            num.push(cnt);
        }
        else{//运算符号
            if(it==')'){//一直匹配运算直到(
                while (st.top() != '(') dot();
                st.pop();
            }
            else{//其它符号,判断优先级
                while(it!='(' && !st.empty() && st.top()!='(' && level[st.top()]>=level[it]){dot();}
                st.push(it);//当前运算符入栈
            }

        }
    }
    while(!st.empty()){dot();}
    cout<<num.top()<<endl;
    return;
}

signed main()
{
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

标签:运算,int,匪石,num,期末,st,大一,Mod,num1
From: https://www.cnblogs.com/yongchaoD/p/18419098

相关文章

  • 期末所需分数.java
    原始问题描述期末考试满分100分,平时成绩满分40分。总评成绩由期末考成绩的60%和平时成绩组成。已知平时成绩,求期末考试至少需得多少分,以确保总评成绩不低于60分。原始版本参考代码importjava.util.Scanner;publicclassFishTank{publicstaticvoidmain(String[]ar......
  • 488.中国风中秋节专题网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • 期末前端web大作业——动漫客栈响应式bootstarp(7页) 排版整洁,内容丰富,主题鲜明 (2)
    HTML实例网页代码,本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。⚽精彩专栏推荐......
  • 大学生网页制作期末作业——html+css+javascript+jquery旅游官网6页 html大学生网站开
    ......
  • 大一新生以此篇开启你的算法之路
    各位大一计算机萌新们,你们好,本篇博客会带领大家进行算法入门,给各位大一萌新答疑解惑。博客文章略长,可根据自己的需要观看,在博客中会有给大一萌新问题的解答,请不要错过。入门简介:算法,从字面意思来说就是计算方法,它是解决的问题的方法。一个问题有很多种方法解决问题,那么这很多......
  • 关于指针(4)的期末复习
    1.回调函数是什么?回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于......
  • 计算机网络知识点总结--适用于期末考试
    第一章 计算机网络概述1.计算机网络的类别1.1按分布范围分:广域网WAN,城域网MAN,局域网LAN, 个人区域网PAN1.2按使用者分:公用网,专用网1.3按交换技术分:电路交换报文交换分组交换1.4.按拓扑结构分:总线型,星型,环型,网状型1.5.按传输技术分:广播式网络 共享公共通信信......
  • 数据结构期末常见知识点
    1AOV网是一种有向无环图2所有的二叉树都满足度数为0的节点比度数为2的节点数多1,也都满足所有的度数*该度数节点的和等于总节点数减1只有完全二叉树满足当节点个数为奇数时,度数为1的点不存在,总节点个数吧......
  • C++期末复习超详细总结知识点(期末冲刺)
    指数形式(即浮点形式)1.5、字符型常量作用:字符型变量用于显示单个字符语法:charch='a';注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号注意2:单引号内只能有一个字符,不可以是字符串C和C++中字符型变量只占用1个字节。字符常量只能包括一个字符,如......
  • 指针(3)的期末复习
    1.字符指针变量在指针的类型中我们知道有⼀种指针类型为字符指针char*代码constchar*pstr="hellobit.";特别容易让同学以为是把字符串到字符指针pstr⾥了,但是本质是把字符串hellobit放hellobit.⾸字符的地址放到了pstr中。 #include<stdio.h>intmain......