hdoj 1274 展开字符串(栈运用)

5人阅读 评论(0) 收藏 举报
分类:

思路:

1.如果是左括号,或者数字则直接压入栈中

2.如果是字母

    2.1 判断栈顶是不是数字num,如果是循环num次,把字母压入栈

    2.2 如果不是直接压入栈

3.如果是右括号

    3.1 将括号内的字符存入temp数组中,并把这些字符出栈

        3.1.1 然后看栈顶,如果是数字则循环多次,将temp压入栈中

        3.1.2 如果不是直接压入栈中

4.最后将栈中所有元素存入数组ans,并输出;

代码如下:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <cmath>
#include <string.h>
#include <stack>
#include<string>
using namespace std;
int is_num(char a)
{
    if (a >= '1'&&a <= '9')
        return 1;
    else
        return 0;
}
int main()
{
    stack <char >a;
    int n;
    char s[1000];
    string temp;
    string ans;

    int len;
    int num;
    int i, j;
    cin >> n;

    while (n--)
    {

        cin >> s;
        ans.clear();
        temp.clear();
        len = strlen(s);
        for (i = 0; i<len; i++)
        {
            if (is_num(s[i]) || s[i] == '(')
                a.push(s[i]);
            else if (s[i] >= 'a'&&s[i] <= 'z')
            {
                if (is_num(a.top()))
                {
                    num = a.top()-'0';
                    a.pop();
                    while (num--)
                        a.push(s[i]);
                }
                else
                    a.push(s[i]);

            }
            else
            {
                while (a.top() != '(')
                {
                    temp.insert(temp.begin(), a.top());
                    a.pop();
                }
                a.pop();
                if (is_num(a.top()))
                {
                    num = a.top() - '0';
                    a.pop();
                }
                else
                {
                    num = 1;
                }
                while (num--)
                {
                    for (j = 0; j<temp.size(); j++)
                    {
                        a.push(temp[j]);
                    }
                }
                temp.clear();
            }

        }
        while (!a.empty())
        {
            ans.insert(ans.begin(), a.top());
            a.pop();
        }
        cout << ans << endl;
    }



    return 0;
}


查看评论

C语言系列之 数据结构栈的运用

清华大学尹成老师、微软全球最具价值专家,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!
  • 2015年06月24日 16:32

HDU1274 展开字符串【栈】

题目大意: 为了表示纺织CAD系统的纱线排列问题。用小写字母来表示不同的纱线,连接在一起表示纱线的组合。 前边加数字表示重复多少次。比如2(abc),a、b、c表示不同的纱线,abc表示纱线组合,2+...
  • u011676797
  • u011676797
  • 2015-04-14 17:55:36
  • 772

HDU-1274-展开字符串(dfs分段字符串处理)

//传送门:http: //acm.hdu.edu.cn/showproblem.php?pid=1274 #include #include #include #include #inclu...
  • survivorone
  • survivorone
  • 2017-03-04 13:41:00
  • 246

hdu1274 展开字符串(递归or栈)

题意:展开 1(1a2b1(ab)1c)= abbabc 3(ab2(4ab))= abaaaabaaaababaaaabaaaababaaaabaaaab 类似的具有 在括号里面,递归特性的的...
  • yexiaohhjk
  • yexiaohhjk
  • 2016-04-16 21:41:38
  • 297

HDU - 1274 展开字符串 递归

传送门 思路:数据量并不大, 我们只需模拟即可,分两种策略   step1 : 如果是数字, 代表需要循环输出, 此时又分两种策略               1:如果后面是“(”, 则需要循环一...
  • lcuwb
  • lcuwb
  • 2017-11-26 15:22:53
  • 71

HDOJ 1274 展开字符串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274 一个关于字符串处理的题目,因为有括号,如果每一次都是去找最里面的左括号再找对应右括号肯定不好处...
  • RaAlGhul
  • RaAlGhul
  • 2016-07-13 14:08:36
  • 256

【递归,栈的应用】hdoj 1274 展开字符串

hdoj 1274 在我看来这题是个挺好的递归题目,对于我这种新手来说,有挺大收获。 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1274 题目大...
  • qq_33199236
  • qq_33199236
  • 2016-03-19 10:22:49
  • 275

hdu 1274 展开字符串 - 栈

在纺织CAD系统开发过程中,经常会遇到纱线排列的问题。 该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括...
  • ly59782
  • ly59782
  • 2017-03-22 17:54:27
  • 173

hdu 1274 展开字符串(栈)

第一次写的时候,思路有点乱,代码写的乱七八糟,后面看了大牛的题解,才恍然大悟!! #include using namespace std; int main() {     int T;     c...
  • u014360070
  • u014360070
  • 2016-06-09 16:51:25
  • 140

hdu 1274展开字符串(用栈来实现的)

题目链接:【hdu 1274展开字符串】 #include #include #include #include #include #include using namespace st...
  • saragrean
  • saragrean
  • 2015-12-07 21:54:55
  • 247
    个人资料
    持之以恒
    等级:
    访问量: 3014
    积分: 751
    排名: 6万+
    文章分类
    文章存档