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

一.栈的特点 :后进先出

二.用单链表实现栈

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

1.stack.h

2.stack.c

3.main.c

四.代码:

stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
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("栈顶元素%d\n",*(int*)stack_top(&s));
    stack_pop(&s);
    printf("栈顶元素%d\n",*(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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

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

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include"stack.h"

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

}  
/************************************
*s  指针 
*data_ptr 传入的数据
*size 传入数据的大小
*******************************************/


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

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#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=%d\n",m);
       }
       printf("栈的元素个数:%d\n",stack_size(&s));
       printf("栈顶元素: %d\n",*(int *)stack_top(&s));
       for(int i=0;i<5;i++)
       {
             m=stack_pop(&s);
             printf("出栈元素为:%d\n",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

加油:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值