• 【数据结构】郝斌数据结构——笔记04


    栈 Stack 

    定义:

    一种可以实现先进后出的存储结构

    分类:

    静态栈: 以数组来作为内核实现

    动态栈:以链表来作为内核实现

    应用:

    函数调用

    中断?

    表达式求值

    内存分配

    缓冲处理

    迷宫?

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    
    typedef enum {
        true = 1,
        false = 0
    } boolean;
    
    typedef struct Node {
        int data;
        struct Node * pNext;
    } * PNODE, NODE;
    
    typedef struct Stack {
        PNODE upNode;
        PNODE downNode;
    } * PSTACK, STACK;
    
    boolean isEmpty(PSTACK pstack);
    void safeCheck(PSTACK pstack);
    void createStack(PSTACK pstack);
    void pushStack(PSTACK pstack, int value);
    boolean popStack(PSTACK pstack, int * pData);
    void traverseStack(PSTACK pstack);
    void clearStack(PSTACK pstack);
    
    int main() {
    
        STACK stack;
        createStack(&stack);
        pushStack(&stack, 10);
        pushStack(&stack, 40);
        pushStack(&stack, 20);
        pushStack(&stack, 30);
        traverseStack(&stack);
    
        int t;
        popStack(&stack, &t);
        printf("%d 
    ", t);
        traverseStack(&stack);
        clearStack(&stack);
        traverseStack(&stack);
    
        return 0;
    }
    
    void safeCheck(PSTACK pstack){
        if (NULL == pstack -> upNode) {
            printf("内存分配失败
    ");
            exit(-1);
        }
    }
    
    /**
     * 创建堆
     * @param pstack
     */
    void createStack(PSTACK pstack){
        pstack -> upNode = (PNODE)malloc(sizeof(NODE));
        safeCheck(pstack);
        pstack -> downNode = pstack -> upNode;
        pstack -> upNode -> pNext = NULL;
    }
    
    /**
     *
     * @param pstack
     * @param value
     */
    void pushStack(PSTACK pstack, int value){
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        newNode -> data = value;
    
        newNode -> pNext = pstack -> upNode;
        pstack -> upNode = newNode;
    }
    
    /**
     * 出栈, 要保存的数据
     * @param pstack
     * @param data
     */
    boolean popStack(PSTACK pstack, int * pData) {
        if (isEmpty(pstack)) return false;
    
        PNODE head = pstack -> upNode;
        pstack -> upNode = head -> pNext;
    
        *pData = head -> data;
        free(head);
        head = NULL;
        return true;
    }
    
    /**
     * 输出栈
     * @param pstack
     */
    void traverseStack(PSTACK pstack) {
        if (isEmpty(pstack)) {
            printf("[]");
            return;
        }
        PNODE tempNode = pstack -> upNode;
        printf("[");
        while (tempNode != pstack -> downNode) {
            if (tempNode -> pNext == pstack -> downNode) {
                printf("%d]
    ", tempNode -> data);
                break;
            }
            printf("%d,", tempNode -> data);
            tempNode = tempNode -> pNext;
        }
    }
    
    /**
     * 判断是否空栈
     * @param pstack
     * @return
     */
    boolean isEmpty(PSTACK pstack) {
        return pstack -> upNode == pstack -> downNode;
    }
    
    /**
     * 清空栈
     * @param pstack 
     */
    void clearStack(PSTACK pstack) {
        if (isEmpty(pstack)) return;
    
        PNODE iterator = pstack -> upNode;
        PNODE iterator2 = NULL;
    
        while (iterator != pstack -> downNode) {
            iterator2 = iterator -> pNext;
            free(iterator);
            iterator = iterator2;
        }
        pstack -> upNode = pstack -> downNode;
    }
    

      

  • 相关阅读:
    简易模拟点击自动化测试工具介绍
    HttpRunner 使用简介
    postman生成测试报告
    Java 多态
    Java 接口与接口的多继承关系
    Java 类实现接口
    Java 接口内容小结
    Java 接口
    Java 抽象
    Java 继承
  • 原文地址:https://www.cnblogs.com/mindzone/p/14619210.html
Copyright © 2020-2023  润新知