나무의 괄호 표기 법
나무의 괄호 표기 법
시간:
1000 ms
메모리 제한:
3000 K
총 시간:
3000 ms
설명:
나무의 괄호 표시 법:
먼저 뿌리 결점 을 한 쌍 의 괄호 에 넣 은 다음 에 그 나 무 를 왼쪽 에서 오른쪽 순서 로 괄호 에 넣 고, 그 나 무 는 같은 방법 으로 처리한다. 같은 층 의 나무 와 그 뿌리 결점 은 둥 근 괄호 로 묶 고, 같은 층 의 나무 사 이 는 쉼표 로 막 고, 마지막 에는 닫 힌 괄호 로 묶는다.예 를 들 어 아래 그림 은 다음 과 같은 형식 으로 쓸 수 있다.
(a(b,c,d,e))
a
/ | | \
b c d e
다 진 트 리 의 괄호 표시 법 을 지정 합 니 다. 다 진 트 리 를 만 들 고 층 차 를 따라 출력 하 라 고 요구 합 니 다.
입력:
다 진 트 리 의 괄호 표시 법: 문자열
출력:
층 차 출력 다 진 트 리
입력 예시:
(a(b,c,d,e))
출력 예시:
abcde
사고방식: 입력 한 문자열 이 모두 몇 층 인지 먼저 판단 하고 levels 층 이 있 으 면 levels 대기 열 을 동적 으로 초기 화 합 니 다.
첫 번 째 문자 부터 문자열 의 현재 문자열 이 어느 층 에 속 하 는 지 판단 하고 i 층 에 속 하면 i 층 대기 열 에 삽입 합 니 다.
마지막 으로 1 층 에서 제 levels 층 대기 열 에 있 는 요 소 를 순서대로 출력 하면 층 차 출력 을 완성 합 니 다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElemType;
///////////////////////////// /////////////////////////////////////
typedef struct _QNode
{
ElemType key;
struct _QNode *next;
}QNode;
typedef struct _Queue
{
QNode *front;
QNode *rear;
}Queue;
void InitQueue(Queue &Q)
{
Q.front=NULL;
Q.rear=NULL;
}//InitQueue
bool isEmpty(Queue &Q)
{
if(Q.front==NULL)
return true;
return false;
}//isEmpty
void EnQueue(Queue &Q, ElemType e)
{
QNode *s=(QNode*)malloc(sizeof(QNode));
s->key=e;
s->next=NULL;
if(isEmpty(Q))
{
Q.front=s;
Q.rear=s;
return;
}
else
{
Q.rear->next=s;
Q.rear=s;
}
}//EnQueue
bool DeQueue(Queue &Q,ElemType &e)
{
if(isEmpty(Q))
return false;
else
{
QNode *node=Q.front;
e=node->key;
Q.front=Q.front->next;
if(Q.front==NULL)
{
Q.rear=NULL;
}
free(node);
}
return true;
}//DeQueue
void DestroyQueue(Queue &Q)
{
ElemType temp;
while(DeQueue(Q,temp)){}
}//DestroyQueue
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
int Levels(char *&str)
{
int levels=0,i;
for(i=0;i<strlen(str);i++)
{
if(str[i]=='(')
levels++;
}
return levels;
}
// e
int Inlevel(char *&str,ElemType e)
{
int i=0,left=0,right=0;
ElemType c;
c=str[0];
while(c!=e)
{
c=str[i];
i++;
if(c=='(') left++;
if(c==')') right++;
}
return left-right;
}
int main()
{
char *str=(char*)malloc(sizeof(char));
scanf("%s",str);
int levels=Levels(str);
// levels
Queue *Q=(Queue*)malloc(sizeof(Queue)*levels);
int i;
for(i=0;i<levels;i++)
{
InitQueue(Q[i]);
}
for(i=0;i<strlen(str);i++)
{
if(str[i]!=','&&str[i]!='('&&str[i]!=')')
{
// ,
EnQueue(Q[Inlevel(str,str[i])-1],str[i]);
}
}
// ,
for(i=0;i<levels;i++)
{
ElemType temp;
while(!isEmpty(Q[i]))
{
DeQueue(Q[i],temp);
printf("%c",temp);
}
}
printf("
");
// , ,
for(i=0;i<levels;i++)
{
DestroyQueue(Q[i]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.