谁能帮我讲一下这个题目的算法?

来源:百度知道 编辑:UC知道 时间:2024/06/15 06:18:14
S = s1 s2...s2n 是一个符合格式的括号的字符串,S能按下面两种方式编码:
P编码:编码是一个整数序列P = p1 p2...pn,pi是第i个右括号之前的左括号的数目。
W编码:编码是一个整数序列W= p1 p2...pn,wi是第i个右括号的编码值,它等于这个右括号到与之匹配的左括号之间的右括号的数目(包括它自己)。比如:
S ( ( ( ( ) ( ) ( ) ) ) )
P 4 5 6 6 6 6
W 1 1 1 4 5 6
请写一个程序将P序列转换成W序列。
输入:第一行是一个整数K,表示有多少个测试用例,以后每两行一个测试用例。每个测试用例第一行为一个整数n(1 <= n <= 20),表示P序列长度,每个测试用例第二行n个非负整数,每个整数之间有一个空格分隔。
输出:每行输出一个测试用例的结果。每行包括n个整数,每个整数之间用一个空格分隔。

#include<iostream.h>
void main()
{
int len;//接收P、W编码长度,或者说是右括号数量
cout<<"请输入P编码的长度:";
cin>>len;
int *XL=new int[--len*2];//用于存储括号序列
//电脑计数从0开始
cout<<"请依次输入P编码:";
int *PCode=new int[len];//存储P编码
for(int i=0;i<=len;i++)
{
cin>>PCode[i];
}
for(i=0;i<=PCode[0]-1;i++)
XL[i]=1;//1代表左括号
XL[i]=2;//2代表右括号
for(int j=1;j<=len;j++)
{
if(PCode[j]>PCode[j-1])
{
XL[++i]=1;
XL[++i]=2;
}
else
{XL[++i]=2;}
}
//////////////////////输出括号序列
i=0;
while(XL[i]==1||XL[i]==2)
{
cout<<XL[i]<<' ';
i++;
}
cout<<endl;
////////////////////构造W编码
i=0;
int *WCode=new int[len];
int count=0,c=0,flag=0;// coutn:右括号计数,c:W编码计数,flag:括号匹配计数
int *p;
while(XL[i]==1||XL[i]==2)
{
//co