데이터 구조 및 알고리즘 - 체인 스택 및 기본 작업(스태킹 및 팝핑 포함) 상세 설명

연결된 스택, 즉 연결된 목록은 스택 저장 구조를 구현하는 데 사용됩니다.

체인 스택의 구현 아이디어는 시퀀스 스택과 유사하며, 시퀀스 스택은 숫자 시퀀스 테이블(배열)의 한쪽 끝을 스택의 하단으로 사용하고 다른 쪽 끝을 스택의 상단으로 사용합니다. 체인 스택의 경우에도 마찬가지입니다. 일반적으로 아래 그림과 같이 연결된 목록의 맨 위를 스택 맨 아래로 꼬리를 사용합니다.

체인 스택 다이어그램

연결된 목록의 헤드를 스택 상단의 한쪽 끝으로 사용하면 데이터를 "스택에" 및 "스택 외부" 작업을 구현할 때 연결 목록을 순회하는 많은 시간 소모적인 작업을 피할 수 있습니다.

연결된 목록의 헤드는 스택의 맨 위로 사용됩니다. 즉, 다음을 의미합니다.

  • 데이터 "푸시" 작업을 구현할 때 연결 목록의 헤드에서 데이터를 삽입해야 합니다.
  • 데이터 "팝핑" 작업을 구현할 때 연결된 목록의 헤드에서 헤드 노드를 삭제해야 합니다.

따라서 체인 스택은 사실상 헤드 보간법에 의해서만 데이터를 삽입하거나 삭제할 수 있는 연결 목록입니다.

체인 스택 요소가 스택으로 푸시됩니다.

예를 들어 요소 1, 2, 3, 4를 차례로 스택에 넣는 것은 헤드 보간 방법을 사용하여 각 요소를 연결 목록에 차례로 추가하는 것과 같습니다. 각 데이터 요소의 추가 프로세스는 다음 그림과 같습니다.

체인 스택 요소를 순서대로 쌓는 과정의 개략도

C 언어 구현 코드는 다음과 같습니다.

//链表中的节点结构
typedef struct lineStack{
    int data;
    struct lineStack * next;
}lineStack;
//stack为当前的链栈,a表示入栈元素
lineStack* push(lineStack * stack,int a){
    //创建存储新元素的节点
    lineStack * line=(lineStack*)malloc(sizeof(lineStack));
    line->data=a;
    //新节点与头节点建立逻辑关系
    line->next=stack;
    //更新头指针的指向
    stack=line;
    return stack;
}

체인 스택 요소가 스택에서 팝됩니다.

예를 들어, 위의 e)에 표시된 체인 스택에서 "선입, 후출"의 원칙에 따라 스택에서 요소 3을 빼내고 싶다면 먼저 스택에서 요소 4를 빼야 합니다. 즉, 연결된 목록에서 제거하면 요소 3이 스택 스택에서 나올 수 있습니다. 전체 작업 프로세스는 아래 그림과 같습니다.

스택에서 튀어나온 체인 스택 요소의 개략도

따라서 체인 스택에서 스택 최상위 요소를 실현하기 위한 C 언어 구현 코드는 다음과 같습니다.

//栈顶元素出链栈的实现函数
lineStack * pop(lineStack * stack){
    if (stack) {
        //声明一个新指针指向栈顶节点
        lineStack * p=stack;
        //更新头指针
        stack=stack->next;
        printf("出栈元素:%d ",p->data);
        if (stack) {
            printf("新栈顶元素:%d\n",stack->data);
        }else{
            printf("栈已空\n");
        }
        free(p);
    }else{
        printf("栈内没有元素");
        return stack;
    }
    return stack;
}

코드에서 if 판단 문을 사용하여 사용자가 "스택은 비어 있지만 데이터를 팝해야 합니다"라는 잘못된 작업을 수행하는 것을 방지합니다.

요약하다

이 섹션에서는 헤드 보간법을 사용하여 데이터의 단일 연결 목록을 조작하여 체인 스택 구조를 구현합니다.다음은 체인 스택의 전체 코드와 C 언어의 기본 작업입니다.

#include <stdio.h>
#include <stdlib.h>
typedef struct lineStack{
    int data;
    struct lineStack * next;
}lineStack;
lineStack* push(lineStack * stack,int a){
    lineStack * line=(lineStack*)malloc(sizeof(lineStack));
    line->data=a;
    line->next=stack;
    stack=line;
    return stack;
}
lineStack * pop(lineStack * stack){
    if (stack) {
        lineStack * p=stack;
        stack=stack->next;
        printf("弹栈元素:%d ",p->data);
        if (stack) {
            printf("栈顶元素:%d\n",stack->data);
        }else{
            printf("栈已空\n");
        }
        free(p);
    }else{
        printf("栈内没有元素");
        return stack;
    }
    return stack;
}
int main() {
    lineStack * stack=NULL;
    stack=push(stack, 1);
    stack=push(stack, 2);
    stack=push(stack, 3);
    stack=push(stack, 4);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    return 0;
}

프로그램 실행 결과는 다음과 같습니다.

弹栈元素:4 栈顶元素:3
弹栈元素:3 栈顶元素:2
弹栈元素:2 栈顶元素:1
弹栈元素:1 栈已空
栈内没有元素

2023년 신버전 데이터 구조 및 알고리즘 자바 동영상 강좌(1부), 시니어 자바 프로그래머가 배워야 할 데이터 구조 및 알고리즘 2023년 신버전 데이터 구조
및 알고리즘 자바 동영상 강좌(2부), 자바 시니어 프로그래머가 배워야 할 데이터 구조 및 알고리즘 배워야 한다

Supongo que te gusta

Origin blog.csdn.net/Itmastergo/article/details/131910308
Recomendado
Clasificación