zoukankan      html  css  js  c++  java
  • 栈程序算法

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    typedef struct Node
    {
        int data;
        struct Node * next;
    }NODE, *PNODE;
    
    typedef struct stack
    {
        PNODE pTop;
        PNODE pBottom;
    }STACK, *PSTACK;
    
    void init(PSTACK);
    void push(PSTACK, int );
    void traverse(PSTACK);
    bool empty(PSTACK);
    bool pop(PSTACK, int *);
    void clear(PSTACK); //清楚里面的内容,框架还存在
    
    int main()
    {
        STACK S; //STACK等价于 struct Stack
        int val;
    
        init(&S); //目的是建立一个空栈
       push(&S, 1); //压栈
        push(&S, 2);
        push(&S, 3);
        traverse(&S); //遍历输出
        if(pop(&S,&val))
            printf("出栈成功,出栈的元素为: %d 
    ", val);
        else
            printf("出栈失败!
    ");
        traverse(&S); //遍历输出
        clear(&S);
        traverse(&S); //遍历输出
    
        return 0;
    }
    void init(PSTACK pS)
    {
        pS->pTop = (PNODE)malloc(sizeof(NODE));
        if(pS->pTop==NULL)
        {
            printf("动态内存分配失败!
    ");
            exit(-1);
        }
        else
        {
            pS->pBottom = pS->pTop; //不能写pS->pTop = pS->pBottom
            pS->pTop->next = NULL; //等价于pS->pBottom->next = NULL;
        }
        //return;
    }
    void push(PSTACK pS, int val)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
    
        pNew->data = val;
        pNew->next = pS->pTop; //pS->pTop不能换成pS->pBottom
        pS->pTop = pNew;
        return;
    }
    void traverse(PSTACK pS)
    {
        PNODE p = pS->pTop; //建一个遍历指针
        while(p!=pS->pBottom)
        {
            printf("%d ",p->data);
            p = p->next;
        }
        printf("
    ");
        return;
    }
    bool empty(PSTACK pS)
    {
        if(pS->pTop==pS->pBottom)
            return true;
        else
            return false;
    }
    //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败返回false,否则返回true
    bool pop(PSTACK pS, int * pVal)
    {
        if(empty(pS)) //pS本身存放的就是S的地址
        {
            return false; //栈空的时候出栈失败
        }
        else
        {
            PNODE r = pS->pTop; //创建一个指针用来指向出栈的元素
            *pVal = r->data; //用pval存放出栈的元素
            pS->pTop = r->next;
            free(r);
            r = NULL;
        }
        return true;
    }
    void clear(PSTACK pS)
    {
        PNODE p = pS->pTop;
        PNODE q = NULL;
        while(p!=pS->pBottom)
        {
            q = p->next; //q用于存放p的后继,以防free(p)找不到p的后继
            free(p);
            p = q;
        }
        pS->pTop = pS->pBottom;
        return;
    }
  • 相关阅读:
    fixed 和 fixed
    SVN命令概要
    项目目录的划分
    作用域(scope), 定义空间(declaration space) 和 生存期(lifetime)
    可伸缩性最佳实践:来自eBay的经验(转)
    TCP连接可用性检测
    面向对象设计
    如何截取Http请求
    eBay架构
    .net3.5下的Socket通信框架
  • 原文地址:https://www.cnblogs.com/spore/p/11083793.html
Copyright © 2011-2022 走看看