您的位置:首页 > 其它

hdoj 1274 展开字符串(递归,栈的应用)

2016-03-19 10:22 363 查看

hdoj 1274

在我看来这题是个挺好的递归题目,对于我这种新手来说,有挺大收获。
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1274

题目大意:看案例就可以了解。
思路:当我看到这题时,第一个想法是用栈来写(因为这题的主要解决的问题是去括号,
看上去跟UVA673有点相似,事实证明这题确实可以用栈来写),
后来同学说可以用递归方法,想然这题嵌套着括号,最自然的想法是从内到外一层一层的往外剥,如何剥呢?就需要用到递归。

递归

首先解释下递归:递归就是递归,字面意思,自己调用自己。
下面是搜刮的别人的总结

递归常常用于分治算法、动态规划算法中。

递归是利用大问题与其子问题间的递推关系来解决问题的。

能采用递归策略的算法一般有以下特征:

(1)为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解

(2)并且这些规模较小的问题也能采用同样的分解和综合方法,分解成更小的问题,并从这些更小的问题的解构造出规模较大问题的解

(3)特别的,当规模N = 1时,能直接得解

自己代码冗长,用别人的代码做解释。
#include <stdio.h>
#include <string.h>
char a[260];
bool is_num(char a) //判断是不是数字
{
if(a>='0' && a<='9')
return 1;
return 0;
}
int func(int pos) //pos 表示数组下标
{
while(a[pos]!=')' && pos<strlen(a))
{
int k=0;  //记录每个字符串前的数值
while(is_num(a[pos]))
{
k=k*10+a[pos]-'0';
pos++;
}
if(k==0) k=1;

int p=-1;
while(k--)      //输出k次麽
{
if(a[pos]=='(')
p=func(pos+1);   //递归的关键(输出括号里面的字符)
else
printf("%c",a[pos]);
}
if(p!=-1) pos=p;
pos++;
}
return pos;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
func(0);
printf("\n");
}
return 0;
}

栈的应用

首先应该做一下UVA673,了解栈的最基础应用
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=614

#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
char a[130];
char change(char a)
{
if(a==')') return '(';
else if(a==']') return '[';
return 0;
}
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
stack<char>q;

gets(a);
int len=strlen(a);
for(int i=0;i<len;i++)
{
if(q.empty())
q.push(a[i]);
else if(q.top()!=change(a[i]))
q.push(a[i]);
else
q.pop();
}
if(len==0||q.empty())
printf("Yes\n");
else
printf("No\n");
}
}


具体方法,转载http://www.07net01.com/2015/04/824258.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: