头文件:
#include<stdlib.h>
#include<stdio.h>
#include<memory.h>
#define N 100
struct stack
{
int a[N];
int top; //标识栈顶
};
//起别名
typedef struct stack Stack;
//因为有副本机制,所以这儿使用地址。
void init(Stack *p); //初始化栈
int isempty(Stack *p); //判断栈是否为空
int isfull(Stack *p); //判断栈是否满
int gettop(Stack *p); //获取栈顶
void push(Stack *p,int key); //进栈
void pop(Stack *p); //出栈
void show(Stack *p); //显示栈的所有数据
stack.c main函数:
#include"stack.h"
//栈的初始化
void init(Stack *p)
{
p->top = -1; //-1代表为空
//第一个数组的地址,第二个要复制的数据,第三个数据的大小
memset(p->a, 0, sizeof(int)*N); //初始化数组的大小,并全部初始化为 0
}
//判断栈是否为空
int isempty(Stack *p)
{
if (p->top == -1)
{
return 1; //为空
}
else
{
return 0; //不为空
}
}
// 判断栈是否满
int isfull(Stack *p)
{
if (p->top == N-1)
{
return 1; //溢出
}
else
{
return 0; //没有溢出
}
}
//得到栈顶的值
int gettop(Stack *p)
{
return p->a[p->top];
}
//进栈,key 为进栈的值
void push(Stack *p, int key)
{
//栈顶加1后判断栈是否满
if (isfull(p))
{
printf("栈溢,无法进栈!");
return;
}
else
{
//得到栈顶加 1
p->top = p->top + 1;
//进栈
p->a[p->top] = key;
}
}
void pop(Stack *p)
{
//判断栈是否为空
if (isempty(p))
{
printf("栈为空,不能出栈!");
return;
}
else
{
printf("%d\n", p->a[gettop(p)]);
p->top = p->top - 1;
}
}
//显示栈的所有数据
void show(Stack *p)
{
while (!isempty(p))
{
printf("%3d", p->a[p->top]);
p->top -= 1;
}
}
void main()
{
Stack stack;
//初始化
init(&stack);
for (int i = 0; i < 5; i++)
{
push(&stack,i);
}
show(&stack);
system("pause");
}