HDU1274 展开字符串【栈】

题目链接:

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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值