poj1068

本文介绍了一种将P序列转换为对应的W序列的算法。通过模拟括号匹配过程,实现括号序列的生成与解析。具体步骤包括输入P序列,模拟括号序列,最后根据括号序列计算出W序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题用简单的模拟法就可以解出来,大致题意:一个括号序列有两种序列数字对应:

第一个是相应的右括号前面有多少左括号

第二个是相应右括号与匹配左括号之间有多少右括号(包括本身)

根据p求w

S       (((()()())))

P-sequence      4 5 6666

W-sequence      1 1 1456

基本思路:基本思路不复杂,先根据p把括号模拟出来,用0,1也可以用’(‘,’)’.

然后根据括号序列检测就可以了.非常简单.匹配的规则是,从右括号的位置往左遍历,当经过的左右括号数目一样时,括号匹配.

#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
    int t = 0,top;
    char S[100];
    cin>>t;//输入测试的次数
    while(t--)
    {
        memset(S,0,sizeof(S));//存放括号的元素清零
        top = 0;//数组下标清零
        int n = 0,x = 0;//x是每次输入的P序列
        int index = 1;//用来标记
        cin>>n;//输入括号的一半(右括号的数量)
        while(n--)
    {
        cin>>x;//输入一个P序列的元素
        for(;index<x;index++)
                S[top++]='(';
            S[top++]=')';
    }
        //从括号获得W序列
        for(int i = 0;i<=top-1;i++)
        {
            if(S[i] == ')')
            {
                int Leftnum = 0,Rightnum = 1,j;//用来寻找与右括号匹配的左括号,j统计右括号数量
                for( j = i-1;Leftnum!=Rightnum;j--)
                {
                    if(S[j]==')')
                    Rightnum++;
                    else
                    Leftnum++;
                }
                cout<<Rightnum<<' ';
            }
        }
        cout<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值