栈是一种先进后出的数据结构,只允许在一端(栈顶)操作,代码中top表示栈顶。
stack.h
/*===============================================
* 文件名称:stack.h
* 创 建 者:cxy
* 创建日期:2024年01月17日
* 描 述:
================================================*/
#ifndef _STACK_H
#define _STACK_H#include <stdio.h>
#include <stdlib.h>typedef struct stack{int *arr; //malloc开辟空间int len; //开辟空间大小int top; //栈顶,栈只能从一端操作(栈顶)
}Stack,*Pstack;int init(Pstack *P,int len); //创建栈
int push_stack(Pstack p,int data); //入栈
int pop_stack(Pstack p,int *data); //出栈,只能从栈顶依次出栈
int empty_stack(Pstack p); //栈空,1为空
int full_stack(Pstack p); //栈满,1为满
int sum_stack(Pstack p); //栈内元素个数#endif
stack.c
/*===============================================
* 文件名称:stack.c
* 创 建 者:cxy
* 创建日期:2024年01月17日
* 描 述:
================================================*/
#include "stack.h"int init(Pstack *P,int len)
{*P = malloc(sizeof(Stack)); //结构体if(NULL == (*P)){perror("init err:*P");return -1;}(*P)->arr = malloc(sizeof(int)*len); //数组if(NULL == (*P)->arr){perror("init err:(*P)->arr");free(*P);return -1;}(*P)->len = len;(*P)->top = -1; //将栈顶作为下标始用return 0;
}int push_stack(Pstack p,int data)
{if(NULL == p){perror("push err:p");return -1;}if(full_stack(p)){perror("push err:full");return -1;}p->arr[++(p->top)] = data;return 0;
}//int *data为出栈元素,通过地址传递改变实际参数
//该函数返回值只作为判断
int pop_stack(Pstack p,int *data)
{if(NULL == p){perror("pop err:p");return -1;}if(empty_stack(p)){perror("pop err:empty");return -1;}*data = p->arr[(p->top)--];return 0;
}int empty_stack(Pstack p)
{if(NULL == p){perror("empty err:p");return -1;}if(p->top == -1)return 1;else return 0;
}
int full_stack(Pstack p)
{if(NULL == p){perror("full err:p");return -1;}if((p->len)-1 == p->top) //如len = 100,arr[100],top为下标最大为99return 1;else return 0;
}int sum_stack(Pstack p)
{if(NULL == p){perror("sum err:p");return -1;}return p->top+1; //下标加1
}
mian.c
/*===============================================
* 文件名称:main.c
* 创 建 者:cxy
* 创建日期:2024年01月17日
* 描 述:
================================================*/
#include "stack.h"int main(int argc, char *argv[])
{ Pstack p;int data;printf("请输入开辟空间元素个数:\n");scanf("%d",&data);init(&p,data);printf("**********empty_stack,1为空**********\n");data = empty_stack(p);printf("%d\n",data);printf("**********push_stack**********\n");for(int i = 1;i < 6;i++){printf("请输入第%i个入栈元素:",i);scanf("%d",&data);push_stack(p,data);}printf("**********full_stack,1为满**********\n");data = full_stack(p);printf("%d\n",data);printf("**********empty_stack,1为空**********\n");data = empty_stack(p);printf("%d\n",data);printf("**********sum_stack**********\n");data = sum_stack(p);printf("栈内共有%d个有效数据\n",data);printf("**********pop_stack**********\n"); //先进后出for(int i = 1;i < 6;i++){pop_stack(p,&data);printf("第%i个出栈元素:%d\n",i,data);}printf("**********empty_stack,1为空**********\n");data = empty_stack(p);printf("%d\n",data);printf("**********full_stack,1为满**********\n");data = full_stack(p);printf("%d\n",data);printf("**********sum_stack**********\n");data = sum_stack(p);printf("栈内共有%d个有效数据\n",data);return 0;
}
结果