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
- P序列问题
- P数序列
- p和np问题
- P,NP,NPC问题
- P、NP、NPC问题
- NP和P问题
- P和NP问题
- P NP 问题
- P、NP、NPC问题
- P/NP问题
- *p++的问题
- P, NP 问题
- P,NP,NPC问题
- p,np问题
- P/NP问题
- 问题 P: 最小时间
- P/NP/NPC问题
- 问题 P 星际交流
- 求二进制数中1的个数
- 如何在公司做人做事
- java编程
- cocos2d随机数
- CSSgram-使用CSS Filters和CSS Blend Modes实现Instagram风格滤镜
- P序列问题
- 图像镜像之竖直镜像
- 函数指针 与 指针函数
- 单链表翻转---C++实现
- 在说PopupWindow
- hdu5505 GT and numbers(贪心)
- 网络发送同步请求——(开发中一般不会使用,但是还是了解的好)
- 用QLPreviewController预览图片视频
- Android自动获取短信验证码