题目描述
牛牛最近学习了加减乘除的四则运算,四则运算是指加法、减法、乘法和除法四种运算。四则运算是小学数学的重要内容,也是学习其它各有关知识的基础。
我们知道,对于一个四则运算组成的表达式,在没有括号的情况下,要遵循先乘除,后加减的法则进行运算。
也就是说我们定义一个运算优先级,乘除法的优先级高于加减法,并且当运算级别相同时,要按照从左到右的顺序进行。
现在给你一个表达式,请你帮助牛牛给这个表达式的每一个运算符标出它在整个表达式求值计算时的时间戳 [time]。它表示该运算符在计算的过程中是第几个被计算的符号。
时间戳的计数从 1 开始,并且用一个中括号括起来紧跟在该运算符的后面。
例如下列表达式 :
1 + 1 + 5 * 6 / 2 - 10 * 2
该表达式中有 7 个运算符,将它们打上时间戳后表达式就可以写作
1+[4]1+[5]5*[1]6/[2]2-[6]10*[3]2
第一个加号后面紧跟的[4]表示第一个加号在整个表达式中是第4个被计算的符
号。
输入格式
第一行输入一个正整数 N,表示输入的四则运算表达式字符串的长度。
接下来输入一行,一个长度为 N 的字符串,字符串仅包括正整数和四则运算符+−∗/。
输出格式
仅一行,请对表达式的每个运算符打上时间戳后输出。
样例 #1
样例输入 #1
14
1+1+5*6/2-10*2
样例输出 #1
1+[4]1+[5]5*[1]6/[2]2-[6]10*[3]2
样例 #2
样例输入 #2
6
114514
样例输出 #2
114514
提示
对于 30% 的数据,保证1 ≤ N ≤ 10^3 。
对于另 10% 的数据,保证运算符中只有 + − 两种。
对于 100% 的数据,保证1 ≤ N ≤ 10^6。字符串是一个合法的表达式,即不会出现连续两个符号,且保证符号的左右侧都为正整数。
这道题数据规模不大,n顶多10^6,所以可以用正常的方法。
既然它说了,不会出现连续两个符号,且保证符号的左右侧都为正整数。
那我们就可以循环一遍字符串,如果遇到运算符号了,那就把它按顺序另存到一个数组里。
循环时再定义一个变量用来储存运算符号的个数,之后再根据这个数循环一遍,按照优先级先找乘除 再找 加减 ,循环式定义 j 为当前运算顺序,定义一个 b 数组用来储存顺序,如果当前第i 位是乘或除,那么 b[i] = j,循环完之后再找加减。
最后输出时 循环一遍字符串 定义 i 和 j ,如果不是运算符号那就直接输出 。如果是,那先输出运算符号, 再输出一对中括号,中括号里输出 b[j],表示对应的顺序。
#include<bits/stdc++.h>
using namespace std;
int n,num=0,ans=0;
string ad;
char a[1000001];
int b[1000001];
int main()
{
cin>>n;
cin>>ad;
for (int i=0,j=1;i<=ad.size();i++)
{
if (ad[i]=='+'||ad[i]=='-'||ad[i]=='*'||ad[i]=='/')
{
a[j]=ad[i];
j++;
}
num=j;
}
for (int i=1,j=1;i<=num;i++)
{
if (a[i]=='*'||a[i]=='/')
{
b[i]=j;
j++;
}
ans=j;
}
for (int i=1,j=ans;i<=num;i++)
{
if (a[i]=='+'||a[i]=='-')
{
b[i]=j;
j++;
}
}
for (int i=0,j=1;i<=ad.size();i++)
{
if (ad[i]=='+'||ad[i]=='-'||ad[i]=='*'||ad[i]=='/')
{
cout<<ad[i];
cout<<"["<<b[j]<<"]";
j++;
}
else cout<<ad[i];
}
return 0;
}