码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1274 展开字符串【栈】

时间:2015-04-14 18:02:04      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1274


题目大意:

为了表示纺织CAD系统的纱线排列问题。用小写字母来表示不同的纱线,连接在一起表示纱线的组合。

前边加数字表示重复多少次。比如2(abc),a、b、c表示不同的纱线,abc表示纱线组合,2+()表示abc

重复两次,即abcabc。如果前边没有数字,则默认为1。现在给你一个这样的字符串,请将表达式展开

输出排列结果。


思路:

使用栈操作,将字符串展开。重点在于去括号。

1)如果遇到数字或是左括号,直接入栈。

2)如果遇到字母,分两种情况:

栈顶元素为数字num,则将字母压入占中num次。

栈顶为左括号或是其他字母,则直接入栈

3)如果遇到右括号,用temp[]存储括号内的字母,并将这些字母出栈。

这时,如果栈顶元素为数字num或是空(num=1),降temp的字母压入栈中num次。

4)将最后栈中的字母全部存入结果ans[]中。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
#include<string>
using namespace std;

string ans,s,temp;

int main()
{
    int T;
    cin >> T;
    stack<char> Q;
    while(T--)
    {
        ans.clear();
        s.clear();
        temp.clear();
        cin >> s;
        int len = s.length();
        for(int i = 0; i < len; ++i)
        {
            if( s[i]=='(' || (s[i] >= '0' && s[i] <= '9') ) //遇到数字,直接入栈
            {
                Q.push(s[i]);
            }
            else if(s[i]>='a' && s[i] <= 'z')       //遇到字母
            {
                if(Q.top()>='0' && Q.top()<='9')    //栈顶元素是数字
                {
                    int num = Q.top() - '0';
                    Q.pop();
                    while(num--)
                        Q.push(s[i]);               //将字母压入栈num次
                }
                else
                    Q.push(s[i]);                   //没有数字,则直接将字母压入栈中
            }
            else if(s[i]==')')                      //遇到右括号
            {
                string temp;
                while(Q.top()!='(')
                {
                    temp.insert(temp.begin(),Q.top());  //存储括号内的字符串
                    Q.pop();
                }
                Q.pop();
                int num;                                //记录需要压入字符串的次数
                if( Q.empty() || !(Q.top()>='0'&&Q.top()<='9') )
                {
                    num = 1;
                }
                else
                {
                    num = Q.top() - '0';
                    Q.pop();
                }
                while(num--)                    //将括号内字符串压入num次
                {
                    for(int j = 0; j < temp.size(); ++j)
                        Q.push(temp[j]);
                }
            }
        }
        while(!Q.empty())       //将栈中字符全部存入结果ans[]中
        {
            ans.insert(ans.begin(),Q.top());
            Q.pop();
        }
        cout << ans << endl;
    }

    return 0;
}



HDU1274 展开字符串【栈】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45045403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!