[刷题之旅no15]P1322 logo语言

读取:(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;
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值