题目描述
计算一个合法括号字符串的P序列。括号字符串的P序列是由每个右括号与其对应左括号之间的右括号个数排列而成的。 例如,括号字符串“((()(())))”的P序列为:“1 1 2 4 5”
输入
一组合法的括号字符串,每个括号字符串一行。
输出
每个括号字符串的P序列输出一行,每个数值后有一个空格。
其实想想很简单,有两种方法。第一种,读入一个左括号,将数1入栈,当读到右括号时,栈顶元素出栈输出,栈内所有元素数值加一。代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define StackSize 100
#define EmptyTos -1
typedef int ElemType;
typedef struct Stack
{
ElemType *base;
int top;
}StackPtr;
void CreatStack(StackPtr &S)
{
S.base = (ElemType *) malloc (StackSize * sizeof(ElemType));
S.top = EmptyTos;
}
int StackEmpty(StackPtr &S)
{
if(S.top == -1)
return TRUE;
return FALSE;
}
int StackFull(StackPtr &S)
{
if(S.top > StackSize - 1)
return TRUE;
return FALSE;
}
int Push(StackPtr &S, int item)
{
if(!StackFull(S))
{
S.base[++S.top] = item;
return OK;
}
return FALSE;
}
int Pop(StackPtr &S)
{
if(!StackEmpty(S))
{
S.top -= 1;
return S.base[S.top + 1];
}
return FALSE;
}
int Add(StackPtr &S)
{
if(StackEmpty(S))
return FALSE;
int temp = S.top;
while(temp != -1)
S.base[temp--] += 1;
return OK;
}
int main()
{
StackPtr S;
CreatStack(S);
char str[100];
while(scanf("%s", str) !=EOF)
{
for(int i = 0; str[i] != '\0'; i++)
{
if(str[i] == '(')
Push(S, 1);
if(str[i] == ')')
{
printf("%d ", Pop(S));
Add(S);
}
}
printf("\n");
}
return 0;
}
第二种方法,将所有括号从左到右按1到n顺序赋值,读到左括号,将数值压栈,读到右括号,将栈顶元素弹出与数组内元素比较大小,输出比它大的数的个数加一输出,并将栈顶元素的数值记录存入数组。(这个要复杂些,不过比较容易想到)代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define StackSize 100
#define EmptyTos -1
typedef int ElemType;
typedef struct Stack
{
ElemType *base;
int top;
}StackPtr;
void CreatStack(StackPtr &S)
{
S.base = (ElemType *) malloc (StackSize * sizeof(ElemType));
S.top = EmptyTos;
}
int StackEmpty(StackPtr &S)
{
if(S.top == -1)
return TRUE;
return FALSE;
}
int StackFull(StackPtr &S)
{
if(S.top > StackSize - 1)
return TRUE;
return FALSE;
}
int Push(StackPtr &S, int item)
{
if(!StackFull(S))
{
S.base[++S.top] = item;
return OK;
}
return FALSE;
}
int Pop(StackPtr &S)
{
if(!StackEmpty(S))
{
S.top -= 1;
return S.base[S.top + 1];
}
return FALSE;
}
int j = -1;
int Find(StackPtr &S, int *t)
{
int temp = 0;
j +=1;
int item = Pop(S);
for(int m = 0; m < j; m++)
{
if(item <= t[m])
temp += 1;
}
t[j] = item;
return temp;
}
int main()
{
char str[100];
StackPtr S;
CreatStack(S);
while(scanf("%s", str) != EOF)
{
int count = 1;
int a[100] = {0};
for(int i = 0; str[i] != '\0'; i++)
{
if(str[i] == '(')
Push(S, count);
if(str[i] == ')')
printf("%d ", Find(S, a) + 1);
count += 1;
}
printf("\n");
}
return 0;
}