栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构 day06 基础知识学习 (栈)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构 day06 基础知识学习 (栈)

一.栈的特点 :后进先出

二.用单链表实现栈

三.老师的代码(3个文件)gcc 编译(今天老师有点懒,所以没有写makefile!!!!!) 

1.stack.h

2.stack.c

3.main.c

四.代码:

stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include 
#include 
#include 
#include 
typedef struct node
{
    void* data;
    struct node* next;
}node,*pnode;

typedef struct 
{
    int size;
    struct node* top;//栈
}stack;

//初始化
void stack_init(stack* s);

//入栈
int stack_push(stack* s,const void* data_ptr,const int size);

//出栈
int stack_pop(stack * s);

//获取栈顶元素
void* stack_top(stack* s);

//获取元素个数
int stack_size(stack* s);

//判断是否为NULL
bool stack_empty(stack* s);

//销毁栈
void stack_destroy(stack* s);

#endif


stack.c

#include "stack.h"

//初始化
void stack_init(stack *s)
{
    if (s == NULL)
    {
        return;
    }
    s->size = 0;
    s->top = NULL;
}

//入栈
int stack_push(stack *s, const void *data_ptr, const int size)
{
    if (s == NULL || data_ptr == NULL || size <= 0)
    {
        return -1;
    }
    node *pnew = (node *)malloc(sizeof(node));
    if (pnew == NULL)
    {
        return -2;
    }
    pnew->data = malloc(size);
    if (pnew->data == NULL)
    {
        return -2;
    }
    memcpy(pnew->data, data_ptr, size);
    pnew->next = s->top;
    s->top = pnew;
    s->size++;
}

//出栈
int stack_pop(stack *s)
{
    if (s == NULL)
    {
        return -1;
    }
    if (stack_empty(s))
    {
        return -2;
    }
    node *ptemp = s->top;
    s->top = s->top->next;
    free(ptemp->data);
    free(ptemp);
    s->size--;
    return 0;
}

//获取栈顶元素
void *stack_top(stack *s)
{
    if (s == NULL)
    {
        return NULL;
    }
    if (stack_empty(s))
    {
        return NULL;
    }
    return s->top->data;
}

//获取元素个数
int stack_size(stack *s)
{
    if (s == NULL)
    {
        return -1;
    }
    return s->size;
}

//判断是否为NULL
bool stack_empty(stack *s)
{
    if (s == NULL || s->size == 0)
    {
        return true;
    }
    return false;
}

//销毁栈
void stack_destroy(stack *s)
{
    if (s == NULL)
    {
        return;
    }
    while (s->size )
    {
        stack_pop(s);
    }
}

main.c

#include "stack.h"

stack s;
int main()
{
    stack_init(&s);
    int data = 1;
    for(int i = 0;i <10;i++ )
    {
        //data *= i+1;
        stack_push(&s,&data,sizeof(int));
    }
    printf("栈顶元素%dn",*(int*)stack_top(&s));
    stack_pop(&s);
    printf("栈顶元素%dn",*(int*)stack_top(&s));
    stack_destroy(&s);
    if(stack_empty(&s))
    {
        printf("栈空n");
    }
    return 0;
}





我写的代码:(差不多)(我的有makefile   嘿嘿 鄙视老师 今天偷懒,注释都没有我写的多)

stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include 
#include 
#include 
#include 

typedef struct node   //栈的节点
{
    void *data;
    struct node* next;
}node, *pnode;

typedef struct stack
{
    int size;
    node* top;    //栈顶指针
}stack;


void stack_init(stack *s );//初始化  
int stack_push(stack *s,const void *data_ptr,const int size  ); //入栈
int stack_pop(stack *s ); //出栈
void * stack_top(stack* s); //获取栈顶元素
int stack_size(stack *s ); //获取栈的元素个数
void stack_delete(stack *s); //销毁栈
bool stack_empty(stack *s); //判断栈是否为空





#endif

stack.c

#include
#include
#include
#include
#include
#include
#include"stack.h"

void stack_init(stack *s )//初始化
{
       if(s==NULL)
       {
              return;
       }
       s->size=0;
       s->top=NULL;

}  



int stack_push(stack *s,const void *data_ptr,const int size  ) //入栈
{
       if(s==NULL ||data_ptr==NULL|| size <=0 )
       {
              return -1;
       }
       node* temp = (node* )malloc (sizeof(node));
       if(temp==NULL)
       {
              return -2;
       }
       temp->data=malloc(size);
       if(temp->data==NULL)
       {
              return -3;
       }
       memcpy(temp->data,data_ptr,size);
       temp->next=s->top;   //跟单链表的头部插入差不多
       s->top=temp;
       (s->size)++;
       return 1;
}

int stack_pop(stack *s ) //出栈
{

       if(s==NULL)
       {
              return -1;
       }  
       node* temp=s->top;
       int a=*(int *)temp->data;  //获取头部的数据
       s->top=temp->next;
       free(temp->data);
       free(temp);
       --(s->size);
       return a;
}
void * stack_top(stack* s) //获取栈顶元素
{
       if(s==NULL)
       {
              return NULL;
       }  
       return s->top->data;
}
int stack_size(stack *s )//获取栈的元素个数
{
       if(s==NULL)
       {
              return -1;
       }  
       return s->size;
}
void stack_delete(stack *s) //销毁栈
{
       if(s==NULL)
       {
              return;
       }  
       while(s->size!=0)
       {
           stack_pop(s);   
       }  
       printf("栈已销毁!n");
}

bool  stack_empty(stack *s ) //判断栈是否为空
{
       if(s==NULL)
       {
              return true;
       } 
       else  if (s->size==0)
       {
              return true;
       }
       else
       {
              return false;
       }
}

main.c

#include
#include
#include
#include
#include
#include
#include"stack.h"

stack s;
int main(int argc,char *argv[])
{
       int m;
       stack_init(&s);
       for(int i=0;i<10;i++)
       {
              m=stack_push(&s,&i,4);
              printf("m=%dn",m);
       }
       printf("栈的元素个数:%dn",stack_size(&s));
       printf("栈顶元素: %dn",*(int *)stack_top(&s));
       for(int i=0;i<5;i++)
       {
             m=stack_pop(&s);
             printf("出栈元素为:%dn",m);
       }
       stack_delete(&s);
       if(stack_empty(&s))
       {
          printf("栈元素没了!n");           
       }
       return 0;
}


makefile

stack :main.o stack.o
	gcc -g -o stack main.o stack.o
main.o:main.c
	gcc -g -c main.c -o main.o
stack.o:stack.c
	gcc -g -c stack.c -o stack.o

加油:

物质的贫穷,能摧毁你一生的尊严,精神的贫穷,能耗尽你几世的轮回。人生没有白走的路,人生没有白读的书,你读过的书,走过的路,会在不知不觉中改变你的认知,悄悄帮你擦去脸上的无知和肤浅。书便宜,但不意味知识的廉价,虽然读书不一定功成名就,不一定能让你锦绣前程,但它能让你说话有德,做事有余,出言有尺,嬉闹有度!
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025561.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号