今天,我将带来栈的实现代码总结。
目录
栈的简概
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈实现的三个文档
Stack.h--------头文件的引用和函数的声明
Stack.c--------函数的定义
test.c--------栈的代码实现的检验
初始化函数
//初始化函数
void InitStack(ST* ps)
{
assert(ps);
ps->data = (STDataType*)malloc(sizeof(STDataType) * 4);
if (ps->data == NULL)
{
perror("InitStack()");
exit(1);
}
ps->capacity = 4;
ps->pos = 0;
}
检验栈是否为空的函数
//检验栈是否空的函数
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->pos == 0;
}
获取栈存储数据个数的函数
//检验栈存储数据的个数
size_t StackDataNum(ST* ps)
{
assert(ps);
return ps->pos;
}
销毁栈的函数
//销毁栈的函数
void DestroyStack(ST* ps)
{
assert(ps);
free(ps->data);
ps->data = NULL;
ps->capacity = ps->pos = 0;
}
入栈函数
//入栈函数
void StackPush(ST* ps, STDataType x)
{
assert(ps);
//ps->pos可以代表存储的数据
if (ps->capacity == ps->pos)
{
STDataType* tmp = (STDataType*)realloc(ps->data,sizeof(STDataType) * ps->capacity * 2);
if (tmp == NULL)
{
perror("StackPush()");
exit(1);
}
ps->data = tmp;
ps->capacity *= 2;
}
ps->data[ps->pos] = x;
ps->pos++;
}
删除栈顶数据的函数
//删除栈顶数据
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->pos--;
}
查看栈顶数据的函数
//查看栈顶的数据
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->data[ps->pos-1];
}
打印函数
//打印函数
void Print(ST* ps)
{
assert(ps);
for(int i = 0; i < ps->pos; i++)
{
printf("%d ",ps->data[i]);
}
printf("\n");
}
函数的定义
//初始化函数
void InitStack(ST* ps);
//检验栈是否空的函数
bool StackEmpty(ST* ps);
//检验栈存储数据的个数
size_t StackDataNum(ST* ps);
//销毁栈的函数
void DestroyStack(ST* ps);
//入栈函数
void StackPush(ST* ps, STDataType x);
//删除栈顶数据
void StackPop(ST* ps);
//查看栈顶的数据
STDataType StackTop(ST* ps);
//打印函数
void Print(ST* ps);
菜单的实现和函数的调用
void menu()
{
printf("*********************************************************\n");
printf("***** 1.入栈 2.查看栈顶 *****\n");
printf("***** 3.删除栈顶 4.栈存储的个数 *****\n");
printf("***** 5.检验栈是否为空 6.打印栈的数据 *****\n");
printf("***** 0.退出 *****\n");
printf("*********************************************************\n");
}
int main()
{
ST Stack;
InitStack(&Stack);
int input = 0;
STDataType num = 0;
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
printf("输入想要入栈的数据\n");
scanf("%d",&num);
StackPush(&Stack,num);
break;
case 2:
printf("%d\n", StackTop(&Stack));
break;
case 3:
StackPop(&Stack);
printf("删除成功\n");
break;
case 4:
printf("%d\n",StackDataNum(&Stack));
break;
case 5:
if (StackEmpty(&Stack))
printf("栈空\n");
else
printf("栈非空\n");
break;
case 6:
Print(&Stack);
break;
case 0:
DestroyStack(&Stack);
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
Stack.c文档的代码
#include "Stack.h"
//初始化函数
void InitStack(ST* ps)
{
assert(ps);
ps->data = (STDataType*)malloc(sizeof(STDataType) * 4);
if (ps->data == NULL)
{
perror("InitStack()");
exit(1);
}
ps->capacity = 4;
ps->pos = 0;
}
//检验栈是否空的函数
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->pos == 0;
}
//检验栈存储数据的个数
size_t StackDataNum(ST* ps)
{
assert(ps);
return ps->pos;
}
//销毁栈的函数
void DestroyStack(ST* ps)
{
assert(ps);
free(ps->data);
ps->data = NULL;
ps->capacity = ps->pos = 0;
}
//入栈函数
void StackPush(ST* ps, STDataType x)
{
assert(ps);
//ps->pos可以代表存储的数据
if (ps->capacity == ps->pos)
{
STDataType* tmp = (STDataType*)realloc(ps->data,sizeof(STDataType) * ps->capacity * 2);
if (tmp == NULL)
{
perror("StackPush()");
exit(1);
}
ps->data = tmp;
ps->capacity *= 2;
}
ps->data[ps->pos] = x;
ps->pos++;
}
//删除栈顶数据
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->pos--;
}
//查看栈顶的数据
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->data[ps->pos-1];
}
//打印函数
void Print(ST* ps)
{
assert(ps);
for(int i = 0; i < ps->pos; i++)
{
printf("%d ",ps->data[i]);
}
printf("\n");
}
Stack.h文档的代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* data;
int capacity;
int pos;
}ST;
//初始化函数
void InitStack(ST* ps);
//检验栈是否空的函数
bool StackEmpty(ST* ps);
//检验栈存储数据的个数
size_t StackDataNum(ST* ps);
//销毁栈的函数
void DestroyStack(ST* ps);
//入栈函数
void StackPush(ST* ps, STDataType x);
//删除栈顶数据
void StackPop(ST* ps);
//查看栈顶的数据
STDataType StackTop(ST* ps);
//打印函数
void Print(ST* ps);
test.c文档的代码
#include"Stack.h"
void menu()
{
printf("*********************************************************\n");
printf("***** 1.入栈 2.查看栈顶 *****\n");
printf("***** 3.删除栈顶 4.栈存储的个数 *****\n");
printf("***** 5.检验栈是否为空 6.打印栈的数据 *****\n");
printf("***** 0.退出 *****\n");
printf("*********************************************************\n");
}
int main()
{
ST Stack;
InitStack(&Stack);
int input = 0;
STDataType num = 0;
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
printf("输入想要入栈的数据\n");
scanf("%d",&num);
StackPush(&Stack,num);
break;
case 2:
printf("%d\n", StackTop(&Stack));
break;
case 3:
StackPop(&Stack);
printf("删除成功\n");
break;
case 4:
printf("%d\n",StackDataNum(&Stack));
break;
case 5:
if (StackEmpty(&Stack))
printf("栈空\n");
else
printf("栈非空\n");
break;
case 6:
Print(&Stack);
break;
case 0:
DestroyStack(&Stack);
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
今天,栈的实现代码总结就讲到这里,关注点一点,下期更精彩。