02142 < 데이터 구조 서론 > 제3 장 스 택, 대열 및 배열

글 목록
  • 3.1 스 택 (stack)
  • 3.1.1 기본 개념
  • 3.1.2 스 택 의 순서 실현
  • 3.1.3 스 택 의 링크 실현
  • 3.1.4 재 귀
  • 3.2 대기 열 (queue)
  • 3.2.1 대열 의 기본 개념
  • 3.2.2 대열 의 순서 실현
  • 3.2.3 대기 열의 링크 실현
  • 3.3 배열
  • 3.3.1 논리 구조 와 기본 연산
  • 3.3.2 배열 의 저장 구조
  • 3.3.3 매트릭스 의 압축 저장 소

  • 3.1 스 택 (스 택)
    3.1.1 기본 개념
  • 스 택 (Stack) 연산 이 제 한 된 선형 표 입 니 다. 이런 선형 표 의 삽입 과 삭제 연산 은 표 의 한 끝 에 한정 되 어 있 습 니 다. 삽입 과 삭 제 를 허용 하 는 한 끝 을 스 택 지붕 이 라 고 하고 다른 한 끝 은 스 택 바닥 이 라 고 합 니 다. 그 어떠한 요소 도 포함 되 지 않 은 스 택 을 빈 스 택 이 라 고 하고 스 택 꼭대기 에 있 는 요 소 를 스 택 꼭대기 요소 라 고 합 니 다.
  • 스 택 의 수정 원칙 은 후진 선 출 (Last In First Out, LIFO) 이 고 스 택 은 후진 선 출 표 라 고도 부 르 며 스 택 의 삽입 과 삭제 연산 을 스 택 과 스 택
  • 이 라 고 부른다.
  • 창고 의 기본 연산:
  • InitStack (S): 빈 스 택 S
  • 를 구축 합 니 다.
  • EmptyStack (S): 스 택 S 가 비어 있 는 지 판단 하고 비어 있 으 면 1 로 돌아 가 며 비어 있 지 않 으 면 0
  • 으로 돌아 갑 니 다.
  • Push (S, x): 스 택 에 들 어가 요소 x 를 S 에 삽입 하여 x 를 S 로 하 는 스 택 톱 요소
  • Pop (S): 스 택 에서 나 와 스 택 상단 요소 삭제
  • 스 택 꼭대기 GetTop (S): 스 택 꼭대기 요 소 를 되 돌려 줍 니 다.
  • 3.1.2 스 택 의 순서 실현
    데이터 손실 을 방지 하기 위해 스 택 에 들 어가 기 전에 스 택 만 료 여 부 를 판단 해 야 합 니 다. 스 택 사용 C 정 의 는 다음 과 같 습 니 다.
    const int maxsize =6;
    typedef struct seqstack {
         
    	DataType data[maxsize];
    	int top;
    } seqStk;
    

    maxsize 는 순차 스 택 의 용량 data [maxsize] 스 택 에 있 는 데이터 요 소 를 저장 하 는 배열 top 표지 스 택 의 맨 위 치 를 나타 내 는 변수 이 고 범 위 는 0 에서 maxsize - 1 입 니 다.
  • 초기 화
  • int InitStack(SeqStk *stk){
         
    	stk->top =0;
    	return 1;
    }
    
  • 판 잔 공
  • int EmptyStack(SeqStk *stk){
         
    	if (stk->top ==0) return  1;
    	else return 0;
    }
    
  • 입고
  • int Push(SeqStk *stk, DateType x){
         
    	if (stk->top == maxsize-1)
    	{
         error("  "); return 0'}
    	else{
         
    		stk->top++;
    		stk->data[stk->top] =x;
    		return 1;
    }
    }
    
  • 출고
  • int Pop(SeqStk *stk){
         
    	if (stk->top ==0){
         
    		error("  ");
    		return 0;
    	}
    	else{
         
    	stk->top--;
    	return 1;
    }
    }
    
  • 창고 꼭대기 원소
  • DataType GetTop(SeqStk *stk){
         
    	if (EmptyStack(stk)) return NULLData;
    	else return stk->data[stk->top]
    }
    

    3.1.3 스 택 의 링크 실현
    스 택 의 링크 는 체인 스 택 이 라 고 부 릅 니 다. 체인 스 택 은 앞장 서 는 노드 의 단일 체인 표 로 LS 가 링크 의 끝 점 을 가리 킬 수 있 습 니 다. 첫 번 째 노드 는 바로 스 택 의 끝 점 입 니 다. LS - > next 는 스 택 의 끝 점 을 가리 키 고 끝 점 은 스 택 의 끝 점 입 니 다. 체인 스 택 은 용량 의 크기 를 고려 하지 않 아 도 됩 니 다. C 언어 정 의 는 다음 과 같 습 니 다.
    typedef struct node {
         
    	DataType data;
    	struct node *next;
    }LkStk;
    
  • 초기 화
  • void InitStack(LkStk *LS){
         
    	LS = (LkStk *)malloc(sizeof(LkStk));
    	LS->next = NULL; //       
    }
    
  • 판 잔 공
  • int EmptyStack(LkStk *LS){
         
    	if (LS->next==NULL) return 1;
    	else return 0;
    }
    
  • 입고
  • void Push(LkStk *LS, DataType x){
         
    	LkStk *temp;
    	temp = (LkStk *)malloc(sizeof(LkStk));  //         
    	temp->data = x; //        x
    	temp->next=LS->next; //     next          
    	LS->next = temp; //         
    }
    
  • 출고
  • int Pop(LkStk *LS){
         
    	LkStk *temp;
    	if (EmptyStack(LS)) return 0;
    	else {
         
    	temp = LS->next;
    	LS->next = temp->next;
    	free(temp);
    	return 1;
    	}
    }
    

    여기 서 좀 더 생각해 보 세 요. 왜 LS->next=LS->next->next 이런 방식 으로 스 택 지붕 을 차 스 택 꼭대기 에 가리 키 지 않 습 니까?이 방식 을 사용 하면 원래 스 택 의 정점 이 존재 하고 메모리 공간 을 차지 합 니 다. 이 를 방출 하지 않 았 기 때문에 여기 서 temp 지침 을 도입 합 니 다. 첫 번 째 단 계 는 temp 이 스 택 의 정점 을 가리 키 고 두 번 째 단 계 는 원래 스 택 의 정점 을 두 번 째 스 택 지붕 으로 가리 키 며 세 번 째 단 계 는 temp 을 방출 합 니 다. 5. 스 택 의 정상 요 소 를 가 져 옵 니 다.
    DataType GetTop(LsStk *LS){
         
    	if (EmptyStack(LS)) return NULLData;
    	else {
         
    		return LS->next->data;  //       
    	}
    }
    

    3.1.4 재 귀
    재 귀: 만약 에 하나의 함수 나 데이터 구조의 정의 에서 그 자신 을 응용 하면 이 함수 나 데이터 구 조 는 재 귀 정의 라 고 부 르 고 재 귀 라 고 부 릅 니 다. 재 귀 정 의 는 '순환 정의' 가 될 수 없 으 며 다음 과 같은 두 가지 조건 이 필요 합 니 다.
  • 정 의 된 항목 이 정의 에서 의 응용 은 업데이트 가 작은 '규모' (유한 재 귀)
  • 를 가진다.
  • 정 의 된 항목 이 최소 규모 에서 의 정 의 는 비 재 귀적 이 며, 이것 은 재 귀적 인 종료 조건 이다.
  • 3.2 대기 열 (queue)
    3.2.1 대열 의 기본 개념
  • 대기 열 은 같은 유형의 데이터 요소 가 제 한 된 선형 서열 로 선진 적 인 선 출 (First In First Out, FIFO) 의 선형 표 입 니 다. 새로 추 가 된 요 소 는 대기 열 끝 에 있 고 대기 열의 데이터 요 소 는 대기 열 첫 부분 에서 삭 제 됩 니 다.
  • 줄 을 서 는 규칙 은 '새치기' 를 허용 하지 않 습 니 다. 새로 추 가 된 요 소 는 팀 의 끝 에 만 있 을 수 있 고 전체 구성원 은 대열 에 들 어 가 는 순서에 따라 대열 을 떠 날 수 있 습 니 다.
  • 기본 연산:
  • 대기 열 초기 화: InitQueue (Q): 빈 대기 열 설정
  • 대기 열 이 비어 있 음: Empty Queue (Q): 대기 열 이 비어 있 으 면 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0
  • 을 되 돌려 줍 니 다.
  • 대기 열 에 들 어 갑 니 다: EnQueue (Q, x): 데이터 요소 x 를 대기 열 끝 에서 대기 열 에 삽입 하여 대기 열의 새로운 꼬리 요소 로 만 듭 니 다.
  • 대기 열: OutQueue (Q): 첫 번 째 요소 삭제
  • 팀 의 첫 번 째 요 소 를 추출: GetHead (Q): 대기 열 첫 번 째 요소 의 값 을 되 돌려 줍 니 다.
  • 3.2.2 대열 의 순서 실현
    const int maxsize=20;
    typedef struct seqqueue{
         
    	DataType Data[maxsize];  //    ,           
    	int front, rear; // front  , rear           
    } SeqQue;
    SeqQue SQ;
    

    data: 1 차원 배열, 저장 대기 열 에 있 는 데이터 요소 front: 지향
    rear: 은 왜 선형 표를 사용 하지 않 고 순환 선형 표를 사용 합 니까?참고 p72 쪽,

    :

    void InitQueue(CycQue CQ){
         
    	CQ.front = 0;
    	CQ.rear = 0;
    }
    
    int EmptyQueue(CycQue CQ){
         
    	if (CQ.front == CQ.rear) return 1;
    	else return 0;
    }
    
    void EnQueue(CycQue CQ, DataTye x){
         
    	if ((CQ.rear+1)%maxsize == CQ.front) {
         
    	error("    ");
    	return 0;
    	}
    	else {
         
    	CQ.rear = (CQ.rear+1) % maxsize;
    	CQ.data[CQ.rear] = x;
    	return 1;
    	}
    }
    
    int OutQueue(CycQue CQ){
         
     	if (EmptyQueue(CQ)) {
         
    		error("     ");
    		return 0;
    	}
    	else{
         
    		CQ.front = (CQ.front+1)%maxsize;  //     
    		return 1;
    	}
    }
    
    DataType GetHead(CycQue CQ){
         
    	if (EmptyQueue(CQ) return NULLData;
    	else{
         
    	return CQ.data[(CQ.front+1)%maxsize];
    }
    }
    
    

    3.2.3

    typedef struct LinkQueueNode{
         
    	DataType data;
    	struct LinkQuequeNode *next;
    }LkQueNode;
    
    typedef struct LkQueNode{
         
    	LkQueNode *front, *rear;
    }LkQue;
    
    LkQue LQ;
    
    void InitQueue(LkQue *LQ){
         
    	LkQueNode *temp;
    	temp = (LkQueNode *)malloc(sizeof(LkQueNode));
    	LQ->front = temp;
    	LQ->rear = temp;
    	(LQ->front)->next = NULL;
    }
    
    int EmptyQueue(LkQue *LQ){
         
    	if (LQ.front == LQ.rear) return 1;
    	else return 0;
    }
    
    void EnQueue(LkQue *LQ, DataType x){
         
    	LkQueNode *temp;
    	temp = (LkQueNode *).malloc(sizeof(LkQueNode));
    	temp->data = x;
    	temp->next = NULL;
    	(LQ->rear)->next = temp; //       
    	LQ->rear = temp; //          
    }
    
    int OutQueue(LkQue *LQ){
         
    	LkQueNode *temp;
    	if (EmptyQueue(LQ)){
         
    		error("    ");
    		return 0;
    	}
    	else{
         
    		temp = LQ->front->next;  // temp        
    		LQ->front->next = temp->next; //         ,         
    		if (temp->next ==NULL); 
    		LQ->rear = 	LQ->front;//      , front rear      
    		free(temp);
    		return 1;
    	}
    }
    
    DataType GetHead(LkQue LQ){
         
    	LkQueNode *temp;
    	if (EmptyQueue(LQ)) return NULLData;
    	else {
         
    		temp = LQ.front->next;
    		return temp->data;  //         
    	}
    }
    

    3.3

    3.3.1

    • , , , . , N N-1 .
    • :
    • : , ;
    • : , ;

    3.3.2

    , ; , . C , .

    .(p82)
    loc[i, j] = loc[0,0] + (n*i +j)*k

    3.3.3

    , , , , , , .
    ,

    a[9,9]
    a[4,5] k :
    , , ,
    , loc[0,0] + 4( 4 )*9( 9 )+5( 5 )
    loc[0, 0] 0, a[4, 5] : 41

    1. (p82)
      N A aij = aji i>=0, j<=n-1, A
      :
      99
      : a[9, 9],
      a[2,3] = a[3, 2]
      9*(9+1)/2 = 45 ,
      : 9*9=81 , a11, a22, a33 , 9 , , (81-9)/2=36 , 9 , 36+9=45 ,
      n(N+1)/2,
      a[9, 8]
      loc[0,0] 0, a[4, 5] (4+1)*4/2 + 5 = 15,
      a[5, 4] K ?
      , a[5, 4] = a[4, 5], 15 ,

    2. (p83)
      ( ) C , ( ) .


    3. M N T , T<=M*N, .

      : ((0, 1, 5), (2, 1, -1))
      : a[0,1]=5, a[2, 1] = -1, 0 ,

    좋은 웹페이지 즐겨찾기