栈是一种先进后出的数据结构,只允许在一端(栈顶)操作,代码中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为下标最大为99
return 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;
}
结果