순환 대기 열 에 적용 되 는 양 휘 삼각형 (C 언어)

4383 단어 데이터 구조
양 휘 삼각형 은 뭐 예요?코드 를 직접 올리다.
네 가지 함수 만 사용: init, inset, delete, get.이 부분 은 상투적인 방법 이다.
#include
#include

#define MAXQSIZE 100

typedef int elemtype;

typedef struct Queue{
	elemtype Queue[MAXQSIZE];
	elemtype front, rear;
}Q;

void init_Q(Q*q)
{
	if (!q)
	{
		exit(0);
	}
	for (int i = 0; i < MAXQSIZE; i++)
	{
		q->Queue[i] = 0;
	}
	q->front = 0;
	q->rear = 0;
}

void delete_Q(Q*q, elemtype*s)
{
    if (q->front == q->rear)
	{
		return;
	}
	*s = q->Queue[q->front];
	q->front = (q->front + 1) % MAXQSIZE;
}

void insert_Q(Q*q, elemtype x)
{
	if ((q->rear + 1) % MAXQSIZE == q->front)
	{
		exit(0);
	}
	q->Queue[q->rear] = x;
	q->rear = (q->rear + 1) % MAXQSIZE;
}

void get_Q(Q*q, elemtype*e)
{
	*e = q->Queue[q->front];
}

                                                                     주로 사고방식 을 말 하 는데 어떻게 양 휘 삼각형 을 생 성 합 니까?
1. 선생님 이 첫 번 째 줄 이 되 고 첫 번 째 줄 은 하나 입 니 다. 바로 팀 에 들 어 갑 니 다.
2. 두 번 째 줄 이후 규칙 이 있 습 니 다. 두 번 째 줄 은 양쪽 의 1 을 제외 하고 다른 수치 가 없습니다. 세 번 째 줄 은 1 을 제외 하면 1 개의 수치 가 있 고 네 번 째 줄 은 1 을 제외 하면 2 개의 수치 가 있 습 니 다. 그래서 아래 n - 1 줄 의 생 성에 순환 을 사용 해 야 합 니 다.
3. 순환 은 무엇 을 포함 합 니까?순환 은 모든 줄 을 만 드 는 데 쓰 인 다 고 이해 할 수 있다. 그러면 먼저 생 성 된 것 은 1 이 고, 그 다음 에 이전 줄 에서 얻 은 것 과 그 다음 에 1 이다.
4. 이전 줄 에서 얻 은 것 과 이것 은 여러 개의 수치 이 고 각 줄 의 수량 이 다 르 기 때문에 이 부분 을 생 성 하려 면 순환 을 해 야 합 니 다.
5. 한 번 순환 하면 두 번 째 줄 을 생 성 할 때 첫 번 째 줄 의 1 을 더 하기 때문에 순환 의 마지막 에 이 남 은 1 을 삭제 합 니 다.그리고 인쇄 를 합 니 다. 함수 가 진행 하 는 마지막 에 인쇄 를 하 는 이상 각 줄 의 마지막 1 을 인쇄 해 야 합 니 다. 곰 곰 이 생각해 보 니 인쇄 가 적당 합 니 다.
그러면 지금 대체적인 구조 가 있다.
int x = 1;
insert_Q(q, x);//      
for (int i = 2; i < n; i++)//  n-1 
	{
		insert_Q(q, x);//       1
		for (j = 0; j < i - 2; j++)//       1     ,   j-2 
		{
			
		}
		insert_Q(q, x);//       1

		delete_Q(q, &s);//        1   
		printf("%5d
", s); }

6. 순환 에 따라 한 번 걸 어가 면 대열 의 수치 변 화 는 이러한 1, 11, 111, 11 이다.이 처 리 는 세 번 째 줄 을 만 들 었 으 나 첫 번 째 줄 의 하나 만 인쇄 되 었 습 니 다.그럼 세 번 째 줄 을 처리 할 때 두 번 째 줄 을 인쇄 하 는 것 을 고려 해 야 합 니 다.다른 줄 의 보편적 인 상황 을 고려 해 야 하기 때문에 이곳 은 어 려 운 점 이다.
7. 세 번 째 줄 을 만 들 기 전 대기 열 은 11 이 고 i 세 번 째 줄 을 만 들 기 시작 하면 순환 에 들 어가 111 이 되 며 줄 의 첫 번 째 줄 을 삭제 하고 인쇄 합 니 다. 이것 은 각 줄 의 첫 번 째 1 이 되 고 대기 열 에서 삭 제 된 1 과 삭 제 된 줄 의 첫 번 째 수 치 를 2 로 추가 합 니 다.2 를 대기 열 에 삽입 합 니 다.이 때 대기 열 은 112 입 니 다. 아래 의 삽입 을 계속 1121 로 바 꾸 고 마지막 삭 제 는 대기 열 첫 번 째 1 을 삭제 하고 인쇄 합 니 다. 이때 대기 열 은 121 이 고 11, 두 번 째 줄 을 인쇄 하여 세 번 째 줄 을 만 들 었 습 니 다.
int x = 1;
insert_Q(q, x);//      
for (int i = 2; i < n; i++)//  n-1 
	{
		insert_Q(q, x);//       1
		for (j = 0; j < i - 2; j++)//       1     ,   j-2 
		{
			delete_Q(q, &s);
			printf("%5d", s);
			get_Q(q, &e);
			insert_Q(q, s + e);
		}
		insert_Q(q, x);//       1

		delete_Q(q, &s);//        1   
		printf("%5d
", s); }

8. 여기 서 매우 교묘 한 것 은 한 줄 을 인쇄 하 는 동시에 대열 에 도 다음 줄 이 생 성 되 었 다 는 것 이다.따라서 for 순환 이 끝나 면 대기 열 에 한 줄 이 존재 하 므 로 줄 을 옮 겨 다 니 며 인쇄 해 야 합 니 다.
int x = 1;
insert_Q(q, x);//      
for (int i = 2; i < n; i++)//  n-1 
	{
		insert_Q(q, x);//       1
		for (j = 0; j < i - 2; j++)//       1     ,   j-2 
		{
			delete_Q(q, &s);
			printf("%5d", s);
			get_Q(q, &e);
			insert_Q(q, s + e);
		}
		insert_Q(q, x);//       1

		delete_Q(q, &s);//         1   
		printf("%5d
", s); } while (q->front != q->rear) { delete_Q(q, &s); printf("%5d", s); }

 
전체 main 함수:
int main()
{
	Q*q = (Q*)malloc(sizeof(Q));
	init_Q(q);
	
	int n, j;
	int x = 1;
	elemtype e, s;

	printf("           :");
	scanf("%d", &n);

	insert_Q(q, x);//      
	for (int i = 2; i < n; i++)//  n-1 
	{
		insert_Q(q, x);//       1
		for (j = 0; j < i - 2; j++)//       1     ,   j-2 
		{
			delete_Q(q, &s);
			printf("%5d", s);
			get_Q(q, &e);
			insert_Q(q, s + e);
		}
		insert_Q(q, x);//       1

		delete_Q(q, &s);//         1   
		printf("%5d
", s); } while (q->front != q->rear) { delete_Q(q, &s); printf("%5d", s); } getchar(); }

ps: 이 순환 디자인 은 정말 교묘 합 니 다. 직접 순환 을 분석 하고 이해 해 야 합 니 다.
                                                                                          End...

좋은 웹페이지 즐겨찾기