P序列问题

来源:互联网 发布:数控编程cnc 编辑:程序博客网 时间:2024/05/17 06:09

题目描述
计算一个合法括号字符串的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 -1typedef 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 -1typedef 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;}
0 0
原创粉丝点击