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;
}
时间: 2024-10-07 06:05:40

HDU1274 展开字符串【栈】的相关文章

HDU 1274 展开字符串 (递归+string类)

题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<stdio.h> #include<iostream> #include<string.h> #include<string> using namespace std; char str[300]; bool vis[300]; int len; string dfs(i

定容字符串栈

import java.util.Scanner; public class FixedCapacityStackOfStrings { private String[] a; private int N; public FixedCapacityStackOfStrings(int cap){ a=new String[cap]; } public boolean isEmpty() { return N==0; } public int size() { return N; } public

杭电acm 1274展开字符串

原题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274 展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3355    Accepted Submission(s): 1619 Problem Description 在纺织CAD系统开发过程中,经常会遇到纱线排列的问题.该问题

HDU 1274 展开字符串

在纺织CAD系统开发过程中,经常会遇到纱线排列的问题. 该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列:重复可以用数字和括号表示,例如:2(abc)表示abcabc:1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解:但是计算机却不能理解.为了使计算机接受,就必须将简单紧凑的表达方式展

【HDOJ】1274 展开字符串

栈的应用,需要注意括号前可能没有数字的情况. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <stack> 6 #include <string> 7 using namespace std; 8 9 #define MAXN 300 10 #define isdigit(c) (c>=

[HDOJ1274]展开字符串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274 递归题. 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <cctype> 8 #include

hdu 1274 展开字符串 (简单dfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1274 思路: 找到匹配的区间 之后dfs #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; char str[300]; void dfs(int l,int r) { int i,j,k;

洛谷P1449 后缀表达式 栈 模拟 字符串

洛谷P1449 后缀表达式 栈 模拟 字符串 栈模拟一下 碰到 . 如果输入的是数字就把数字放进栈中 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <io

Java学习笔记之:java引用数据类型之字符串

package com.hgd.study; /** * 引用数据类型之字符串 * * 栈空间:存放的是比较小的数据,包含基本数据类型和字符串,变量名 * 堆空间:存放的是引用数据类型 * @author HuTiger * */ public class ReferenceTypesString { public static void main(String[] args) { int i =100;//声明一个整型,并初始化 //在java中字符串将作为引用数据类型 String name