礼物包装 括号匹配 C语言栈操作

16 篇文章 0 订阅
3 篇文章 0 订阅

 这天,小特生日。他的好朋友给他送来了生日礼物,这些礼物都经过精心包装放在若干个盒子里,而礼物就放在最里层的盒子里。朋友给他送的礼物遵循了这样一条规则, 越有价值的礼物应该放在越深的盒子里。他收到礼物后,急切地想知道这些礼物的价值,于是他把他收到的礼物写成括号的形式表示出来。具体他是这样计算他的礼物的价值的:

      1.-对括号代表一个礼物盒子,盒子里面可以再放盒子,即括号里可以再放括号;若-对括号里没有括号,则代表里面放着礼物。

      2.单独的一对括号代表这个礼物只有1层包装,价值为1 (比如"()"表示价值为1的礼物)

      3.两个合法的括号序列的拼接而成的括号序列的价值是它们价值之和(比如"())"价值为1+1=2)

      4.礼物每在盒子里放的层数深-层, 它的价值就会翻倍。即嵌套括号序列的价值是,所嵌套的括号序列的价值的翻倍(比如((0))"价值为1*2* 2=4)

      根据小特判断礼物的规则,请告诉他,他所写的括号代表了多少价值的礼物。

      小特保证他写的括号是正确合法的

 

Input
一个只包含'('和')'的合法的括号序列S,代表小特写下的括号序列,一个合法的括号序列是这样定义的:1、()是合法的括号序列
2、若字符串A和B是合法的括号序列,那么AB也是合法的括号序列
3、若字符串A是合法的括号序列,那么(A)也是合法的括号序列2<= ISI <=50
Output
一一个数字,代表小特所写的括号序列所代表的礼物的价值
Sample Input
(()(()))

Sample Output
6
代码:

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;
stack<char> s;
char a[55];

int main()
{	
	int n,i,k,sum;
	while(~scanf("%s",&a))
	{
		k=0,sum=0;
		for(i=0;i<strlen(a);i++)
		{
			if(a[i]=='(')
			{
				s.push('(');
				k++;
			}
			else if(a[i]==')')
			{
				k--;
				if(s.top()=='(')
				{
					s.push(')');	
					sum+=pow(2,k);
					//printf("%d\n",sum);
				}
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值