스 택 과 대기 열 설명 및 구현

글 목록
  • 1. 창고
  • (1). 스 택 초기 화
  • (2). 입 점
  • (3). 출고
  • (4). 창고 꼭대기 원소 가 져 오기
  • (5). 창고 에 있 는 유효 원소 개 수 를 가 져 옵 니 다
  • (6). 스 택 이 비어 있 는 지 확인 하고, 비어 있 으 면 true 로 돌아 가 며, 비어 있 지 않 으 면 false 로 돌아 갑 니 다
  • (7). 창고 폐기
  • (8). 전체 코드 구현
  • 2. 대열
  • (1). 대기 열 초기 화
  • (2). 대열 에 들 어가 기
  • (3). 대기 열
  • (4). 대기 열 머리 요소 가 져 오기
  • (5). 대열 의 꼬리 요소 획득
  • (6). 대기 열 에 있 는 유효 요소 갯 수 가 져 오기
  • (7). 대기 열 이 비어 있 는 지 확인 합 니 다. 비어 있 으 면 true 로 돌아 갑 니 다. 비어 있 지 않 으 면 false
  • 입 니 다.
  • (8). 대기 열 소각
  • (9). 전체 코드 구현

  • 창고
    스 택: 특수 한 선형 표 로 고정된 한 끝 에 만 요 소 를 삽입 하고 삭제 할 수 있 습 니 다.데이터 삽입 과 삭제 작업 을 하 는 한 끝 을 스 택 지붕 이 라 고 하고 다른 한 끝 을 스 택 바닥 이 라 고 합 니 다.스 택 에 있 는 데이터 요 소 는 후진 선 출 LIFO (Last In First Out) 의 원칙 을 준수 합 니 다.
    스 택: 스 택 의 삽입 작업 을 스 택 / 스 택 / 스 택 에 들 어가 고 데 이 터 는 스 택 꼭대기 에 있 습 니 다.
    스 택 나 가기: 스 택 의 삭제 작업 을 스 택 나 가기 라 고 합 니 다.데이터 도 창고 꼭대기 에 있 습 니 다.
    Stack. h 중 일부 성명
    #include
    #include
    #include
    #include
    #define INIT_CAPACITY 4
    typedef int STDataType;
    typedef struct Stack
    {
         
    	STDataType* a;
    	int top;  //     
    	int capacity; //    
    }Stack;
    

    (1). 스 택 초기 화
    (1). 스 택 동적 으로 메모리 공간 을 엽 니 다 (2). 스 택 의 맨 아래 표 시 를 0 으로 설정 합 니 다. 즉, 스 택 의 맨 아래 표 시 는 top 이 스 택 의 유효 요소 의 개 수 를 대표 합 니 다 (3). 스 택 의 시작 용량 을 설정 합 니 다.
    void StackInit(Stack* pst)
    {
         
    	assert(pst);
    	pst->a = (STDataType*)malloc(sizeof(STDataType) * INIT_CAPACITY);
    	if (pst->a == NULL)
    	{
         
    		printf("malloc failed
    "
    ); exit(-1); } pst->top = 0; pst->capacity = INIT_CAPACITY; }

    (2) 입 점
    (1). 스 택 공간 이 가득 차 면 realloc 함수 동적 용량 증가 (2) 를 사용 합 니 다. 스 택 에 들 어간 데 이 터 를 스 택 에 넣 습 니 다 (3). 스 택 맨 위 에 표 시 된 + 1
    void StackPush(Stack* pst, STDataType x)
    {
         
    	assert(pst);
    	//     
    	if (pst->top == pst->capacity)
    	{
         
    		pst->capacity *= 2;
    		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity);
    		if (tmp == NULL)
    		{
         
    			printf("realloc failed
    "
    ); exit(-1); } pst->a = tmp; } pst->a[pst->top] = x; pst->top++; }

    (3). 출고
    (1). 스 택 이 비어 있 는 지 판단 하기 (2). 스 택 맨 아래 표 - 1
    void StackPop(Stack* pst)
    {
         
    	assert(pst);
    	assert(!StackEmpty(pst));
    	pst->top--;
    }
    

    (4). 스 택 상단 요소 가 져 오기
    (1). 창고 가 비어 있 는 지 판단 하기 (2). 창고 꼭대기 요 소 를 가 져 오기
    STDataType StackTop(Stack* pst)
    {
         
    	assert(pst);
    	assert(!StackEmpty(pst));
    	return pst->a[pst->top - 1];
    }
    

    (5). 스 택 의 유효 요소 개 수 를 가 져 옵 니 다.
    스 택 맨 아래 표 시 는 스 택 의 유효 요소 갯 수 입 니 다.
    int StackSize(Stack* pst)
    {
         
    	assert(pst);
    	return pst->top;
    }
    

    (6). 스 택 이 비어 있 는 지 확인 합 니 다. 비어 있 으 면 true 로 돌아 갑 니 다. 비어 있 지 않 으 면 false 로 돌아 갑 니 다.
    스 택 맨 아래 표 시 는 스 택 의 유효 요소 개 수 를 대표 하기 때문에 스 택 맨 아래 표 시 를 0 으로 판단 하면 됩 니 다.
    bool StackEmpty(Stack* pst)
    {
         
    	assert(pst);
    	return pst->top == 0;
    }
    

    (7). 창고 소각
    (1). 스 택 의 맨 아래 표지 와 스 택 의 용량 을 0 (2) 으로 설정 합 니 다. 동적 으로 열 린 메모리 공간 을 방출 합 니 다.
    void StackDestroy(Stack* pst)
    {
         
    	assert(pst);
    	pst->top = pst->capacity = 0;
    	free(pst->a);
    	pst->a = NULL;
    }
    

    (8). 전체 코드 구현
    Stack.h
    #pragma once
    #include
    #include
    #include
    #include
    #define INIT_CAPACITY 4
    typedef int STDataType;
    typedef struct Stack
    {
         
    	STDataType* a;
    	int top;  //     
    	int capacity; //    
    }Stack;
    //      
    void StackInit(Stack* pst);
    //   
    void StackPush(Stack* pst, STDataType x);
    //   
    void StackPop(Stack* pst);
    //       
    STDataType StackTop(Stack* pst);
    //         
    int StackSize(Stack* pst);
    //        ,    true,    false
    bool StackEmpty(Stack* pst);
    //   
    void print(Stack* pst);
    //    
    void StackDestroy(Stack* pst);
    

    Stack.c
    #include"Stack.h"
    //   
    void print(Stack* pst)
    {
         
    	assert(pst);
    	int i = 0;
    	for (i = 0; i < pst->top; i++)
    	{
         
    		printf("%d ", pst->a[i]);
    	}
    	printf("
    "
    ); } // , true, false bool StackEmpty(Stack* pst) { assert(pst); return pst->top == 0; } // void StackInit(Stack* pst) { assert(pst); pst->a = (STDataType*)malloc(sizeof(STDataType) * INIT_CAPACITY); if (pst->a == NULL) { printf("malloc failed
    "
    ); exit(-1); } pst->top = 0; pst->capacity = INIT_CAPACITY; } // void StackPush(Stack* pst, STDataType x) { assert(pst); // if (pst->top == pst->capacity) { pst->capacity *= 2; STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity); if (tmp == NULL) { printf("realloc failed
    "
    ); exit(-1); } pst->a = tmp; } pst->a[pst->top] = x; pst->top++; } // void StackPop(Stack* pst) { assert(pst); assert(!StackEmpty(pst)); pst->top--; } // STDataType StackTop(Stack* pst) { assert(pst); assert(!StackEmpty(pst)); return pst->a[pst->top - 1]; } // int StackSize(Stack* pst) { assert(pst); return pst->top; } // void StackDestroy(Stack* pst) { assert(pst); pst->top = pst->capacity = 0; free(pst->a); pst->a = NULL; }

    TestStack.c
    #include"Stack.h"
    void TestStack01()
    {
         
    	Stack st;
    	StackInit(&st);
    	StackPush(&st, 1);
    	StackPush(&st, 2);
    	StackPush(&st, 3);
    	StackPush(&st, 4);
    	print(&st);
    	
    	StackPop(&st);
    	print(&st);
    	StackPop(&st);
    	StackPop(&st);
    	StackPop(&st);
    	StackPop(&st);
    
    	StackDestroy(&st);
    
    }
    int main()
    {
         
    	TestStack01();
    }
    

    대열
    대기 열: 한 끝 에 만 데 이 터 를 삽입 할 수 있 고 다른 한 끝 에서 데 이 터 를 삭제 하 는 특수 선형 표 입 니 다. 대기 열 은 먼저 FIFO (First In First Out) 를 가지 고 있 습 니 다.
    입 대기 열: 삽입 작업 을 하 는 한 끝 을 팀 꼬리 라 고 합 니 다.
    출력 대기 열: 삭제 작업 을 하 는 한 끝 을 팀 헤드 라 고 합 니 다.
    Queue. h 중 일부 성명
    typedef int QDataType;
    typedef struct QueueNode
    {
         
    	QDataType data;
    	struct QueueNode* next;
    }QueueNode;
    typedef struct Queue
    {
         
    	QueueNode* head;
    	QueueNode* tail;
    }Queue;
    

    (1). 대기 열 초기 화
    팀 헤드 와 팀 꼬리 지침 을 비 워 두다.
    void QueueInit(Queue* pq)
    {
         
    	assert(pq);
    	pq->head = pq->tail = NULL;
    }
    

    (2). 대기 열 에 들 어가 기
    (1). 대기 열 이 비어 있 으 면 head 와 tail 포인터 가 새로운 신청 의 끝 점 을 가리 키 게 합 니 다 (2). 대기 열 이 비어 있 지 않 으 면 tail - > next 가 새로운 신청 의 끝 점 을 가리 키 고 tail 을 새로운 꼬리 로 이동 합 니 다 (tail = tail - > next)
    void QueuePush(Queue* pq, QDataType x)
    {
         
    	assert(pq);
    	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
    	if (newNode == NULL)
    	{
         
    		printf("malloc failed
    "
    ); exit(-1); } newNode->data = x; newNode->next = NULL; if (pq->head == NULL) { pq->head = pq->tail = newNode; } else { pq->tail->next = newNode; pq->tail = pq->tail->next; } }

    (3).
    대열 을 나 서 는 것 은 삭제 하 는 것 과 같다.
    (1). 대기 열 이 비어 있 는 지, 비어 있 는 지 판단 합 니 다. (2) 두 번 째 노드 의 주소 (3) 를 저장 합 니 다. 첫 번 째 노드 (4) 를 풀 어 줍 니 다. head 지침 을 바 꾸 어 새 머리 를 가리 키 도록 합 니 다.
    void QueuePop(Queue* pq)
    {
         
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	QueueNode* next = pq->head->next;
    	free(pq->head);
    	pq->head = next;
    }
    

    (4). 대기 열 머리 요소 가 져 오기
    (1). 대기 열 이 비어 있 는 지 여 부 를 판단 하고 빈 단언 으로 오 류 를 알 립 니 다 (2). head - > data 로 돌아 갑 니 다.
    QDataType QueueFront(Queue* pq)
    {
         
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	return pq->head->data;
    }
    

    (5). 줄 의 끝 요 소 를 가 져 옵 니 다.
    (1). 대기 열 이 비어 있 는 지 여 부 를 판단 하고 빈 단언 으로 오 류 를 알 립 니 다 (2). tail - > data 로 돌아 갑 니 다.
    QDataType QueueBack(Queue* pq)
    {
         
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	return pq->tail->data;
    }
    

    (6). 대기 열 에 있 는 유효 요소 개 수 를 가 져 옵 니 다.
    링크 를 옮 겨 다 니 며 링크 요소 의 개 수 를 얻 으 면 됩 니 다.
    int QueueSize(Queue* pq)
    {
         
    	assert(pq);
    	int count = 0;
    	QueueNode* cur = pq->head;
    	while (cur)
    	{
         
    		count++;
    		cur = cur->next;
    	}
    	return count;
    }
    

    (7). 대기 열 이 비어 있 는 지 확인 합 니 다. 비어 있 으 면 true 로 돌아 갑 니 다. 비어 있 지 않 으 면 false 입 니 다.
    헤드 포인터 가 비어 있 는 지 확인 하면 됩 니 다.
    bool QueueEmpty(Queue* pq)
    {
         
    	assert(pq);
    	return pq->head == NULL;
    }
    

    (8). 대기 열 폐기
    링크 를 옮 겨 다 니 며 하나씩 없 애 면 됩 니 다.
    void QueueDestroy(Queue* pq)
    {
         
    	assert(pq);
    	QueueNode* cur = pq->head;
    	while (cur)
    	{
         
    		QueueNode* next = cur->next;
    		free(cur);
    		cur = next;
    	}
    }
    

    (9). 전체 코드 구현
    Queue.h
    #pragma once
    #include
    #include
    #include
    #include
    typedef int QDataType;
    typedef struct QueueNode
    {
         
    	QDataType data;
    	struct QueueNode* next;
    }QueueNode;
    typedef struct Queue
    {
         
    	QueueNode* head;
    	QueueNode* tail;
    }Queue;
    //      
    void QueueInit(Queue* pq);
    //   
    void QueuePush(Queue* pq, QDataType x);
    //   
    void QueuePop(Queue* pq);
    //   
    bool QueueEmpty(Queue* pq);
    //       
    QDataType QueueBack(Queue* pq);
    //       
    QDataType QueueFront(Queue* pq);
    //     
    void QueueDestroy(Queue* pq);
    //       
    int QueueSize(Queue* pq);
    

    Queue.c
    #include"Queue.h"
    //      
    void QueueInit(Queue* pq)
    {
         
    	assert(pq);
    	pq->head = pq->tail = NULL;
    }
    //   
    void QueuePush(Queue* pq, QDataType x)
    {
         
    	assert(pq);
    	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
    	if (newNode == NULL)
    	{
         
    		printf("malloc failed
    "
    ); exit(-1); } newNode->data = x; newNode->next = NULL; if (pq->head == NULL) { pq->head = pq->tail = newNode; } else { pq->tail->next = newNode; pq->tail = pq->tail->next; } } // void QueuePop(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); QueueNode* next = pq->head->next; free(pq->head); pq->head = next; } // bool QueueEmpty(Queue* pq) { assert(pq); return pq->head == NULL; } // QDataType QueueBack(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); return pq->tail->data; } // QDataType QueueFront(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); return pq->head->data; } // void QueueDestroy(Queue* pq) { assert(pq); QueueNode* cur = pq->head; while (cur) { QueueNode* next = cur->next; free(cur); cur = next; } } // int QueueSize(Queue* pq) { assert(pq); int count = 0; QueueNode* cur = pq->head; while (cur) { count++; cur = cur->next; } return count; }

    좋은 웹페이지 즐겨찾기