读取:(scanf不读取空格,getchar()读取空格)
先读一个字符
若R
那么直接跳过五个字符,直接读取数字,然后再跳过一个字符
把R入字符栈,数字入数字栈
然后再跳过一次(把左括号跳过去)
若F或者B
那么跳过一个字符,读取数字,二者入栈
若‘]’,相当于出栈信号。
此时一直出栈,直到遇到R为止
数字和f一定要对应
判断stack_c[top_c]
若F,sum=sum+stack_n[top_n];
top_c–,top_n–;
若B,sum=sum-stack_n[top_n];
top_c–,top_n–;
若R,sum=sum*stack_n[top_n];
然后字符数组入一个F,数字数组入把sum入进去(相当先出再入top不变)
stack_c[top_c]=F,stack_n[top_n]=sum
sum=0;//归零操作,ok非常完美
;break;
若‘\n’
那么直接break掉
最后将栈中剩下的值处理掉,规则就是判断f或者b就可以
输出sum即可。
全都TLE了,干,我没法判断终止条件,呜呜呜草。那你不是\n又不是\0又不是EOF我日!我日!我日!什么破题啊!
生气!不会因为这个就让我重写吧,天啊
好吧,老老实实用%s吧。故意恶心人啊!!
直接快速读取,可能会出现空格现象
用for循环遍历:
如果是空格,直接跳过
其他差不多,就是数字的读取和
跳过特定数量的字符做一个函数
参数i和x
达到的目的就是跳过i之后的x个非空格字符。
返回值为跳过之后的下标
读取数字做一个函数
参数就是当前第一个数字的下标
返回值就是当前数字的最后一个数字的下标
利用广域num对数字进行存储。
错误:
%s读不进去空格!!!!!!!
直接用gets(str)
感动天感动地!!!!!过了
学习一下大佬思路:
大佬就是大佬,利用递归直接处理掉了这个
1.递归里面有一些初始条件,然后
2.有一个循环
3.每次读取,判断情况
如果是左括号
直接break,啥都不读了。
如果是右括号
说明一次递归结束,直接break即可
如果是fb
直接按规定加减数字
如果是r
那么直接把读取到的r后面的数字乘以递归即可
循环结束后直接return sum即可。
附代码:
#include<stdio.h>
#include<string.h>
char stack_c[255],str[256];
int stack_n[255],top=0,num=0,sum=0;
int trans(int a);
int main()
{
gets(str);
// printf("%c",str[3]);
for(int i=0;;i++)
{
if(str[i]==' '||str[i]=='[')
{
continue;
}
if(str[i]=='R')//此时遇到了repeat,需要跳过后面五个字符
{
while(1)
{
i++;
if(str[i]>='0'&&str[i]<='9')//遇到了我们的数字,直接break
{
break;
}
}
//现在把数字处理一下
i=trans(i);
top++;
stack_c[top]='R';
stack_n[top]=num;
}
else if(str[i]=='F'||str[i]=='B')
{
top++;
stack_c[top]=str[i];
while(1)
{
i++;
// printf("srt[%d]=%c\n",str[i]);
if(str[i]>='0'&&str[i]<='9')//遇到了我们的数字,直接break
{
// printf("i=%d\n",i);
break;
}
}
i=trans(i);
stack_n[top]=num;
}
else if(str[i]==']')
{
while(1)
{
if(stack_c[top]=='F')
{
sum=sum+stack_n[top];
top--;
}
else if(stack_c[top]=='B')
{
sum=sum-stack_n[top];
top--;
}
else if(stack_c[top]=='R')
{
sum=sum*stack_n[top];
stack_c[top]='F';
stack_n[top]=sum;
sum=0;
break;
}
}
}
else if(str[i]=='\0')
{
break;
}
}
while(1)
{
if(top==0)//等于0说明结束了
{
if(sum>0)
{
printf("%d",sum);
}
else
{
printf("%d",-sum);
}
break;
}
if(stack_c[top]=='F')
{
sum=sum+stack_n[top];
top--;
}
else if(stack_c[top]=='B')
{
sum=sum-stack_n[top];
top--;
}
}
return 0;
}
int trans(int a)
{
num=0;//初始化
// printf("I=%d\n",a);
for(int j=a;;j++)
{
// printf("str[%d]=%c\n",a,str[a]);
num=num*10+(str[j]-'0');
if(str[j+1]<'0'||str[j+1]>'9')//判断下一位不是数字,那么直接退出就行
{
// printf("%d\n",num);
return j;
}
}
}