stack.h
#pragma once
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<Windows.h>
typedef int DataType;
typedef struct Stack
{
DataType *arr;//指向动态空间的指针
int capacity;//空间总容量
int size;//有效元素个数
}Stack;
// 栈的初始化
void StackInit(Stack* s, int capacity);
// 入栈
void StackPush(Stack* s, DataType data);
// 出栈
void StackPop(Stack* s);
// 获取栈顶元素
DataType StackTop(Stack* s);
// 获取栈中元素个数
int StackSize(Stack* s);
// 检测栈是否为空
int StackEmpty(Stack* s);
//打印栈
void stackprint(Stack* s);
stack.c
#include "Stack.h"
//初始化栈,有效元素清空,分配起始空间
void StackInit(Stack* s, int capacity)
{
if (NULL == s)
return;
s->arr = (DataType *)malloc(sizeof(DataType)*capacity);
if (NULL == s->arr)
{
printf("申请空间失败!!!\n");
return;
}
s->capacity = capacity;//空间容量改变
s->size = 0;//有效元素清空
}
void AddCapacity(Stack* s)
{
if (NULL == s)
return;
s->arr = (DataType *)realloc(s->arr, sizeof(DataType)*(s->capacity) * 2);//扩增位原空间大小二倍
if (NULL == s->arr)
{
printf("空间扩增失败!!!\n");
return;
}
s->capacity = 2 * (s->capacity);
}
//打印栈
void PrintStack(Stack* s)
{
int i = 0;
if (NULL == s)
return;
for (; i < s->size; i++)
{
printf("%d ", s->arr[i]);
}
printf("\n");
}
//入栈,就是对表进行尾插
void StackPush(Stack* s, DataType data)
{
if (NULL == s)
return;
if (s->size == s->capacity)//说明空间已满,要申请空间
AddCapacity(s);
s->arr[s->size] = data;
s->size++;
}
//出栈
void StackPop(Stack* s)
{
if (NULL == s)
return;
if (s->size == 0)
{
printf("栈已空,操作失败!!!\n");
return;
}
s->size--;
}
// 获取栈顶元素,栈顶就是表的尾部
DataType StackTop(Stack* s)
{
if (NULL == s)
{
printf("栈不存在!!!\n");
return;
}
if (s->size == 0)
{
printf("栈已空!!!\n");
return;
}
return s->arr[s->size - 1];
}
// 获取栈中元素个数
int StackSize(Stack* s)
{
if (NULL == s)
{
printf("栈不存在!!!\n");
return 0;
}
return s->size;
}
// 检测栈是否为空
int StackEmpty(Stack* s)
{
if (NULL == s)
{
printf("栈不存在!!!\n");
return 0;
}
if (s->size)
return 0;
return 1;
}
void stackprint(Stack* s)
{
int i = 0;
if (NULL == s)
return;
for (; i < s->size;i++)
{
printf("%d->",s->arr[i]);
}
printf("\n");
}
test.c
#include"Stack.h"
void test()
{
Stack s;
StackInit(&s, 10);
StackPush(&s, 2);
StackPush(&s, 3);
StackPush(&s, 4);
StackPush(&s, 5);
stackprint(&s);
StackPop(&s);
stackprint(&s);
StackTop(&s);
}
int main()
{
test();
system("pause");
return 0;
}