目录
一,seq_stack.h头文件代码:
二,seq_stack.c文件内
1.创建空栈
2.入栈
3.出栈
4.栈的清空和销毁
三,详细代码
数据结构中的栈,有顺序栈与链式栈两种,本文主要分享顺序栈的创建,入栈出栈等基本操作,详细代码与解释,仅供学习与参考,转载请标明出处。
#ifndef _STACK_H_
#define _STACK_H_
#include
#include
typedef int datatype;
typedef struct
{
datatype *data;//栈的首地址;看.c文件中的创建函数
int len;//栈的长度,顺序栈根据顺序结构的特点,需要定义长度
int top;//栈的最后一个元素下标,类似与顺序表的last
}stack_t;
//1.创建空栈
stack_t *CreateStack(int len);
//2.判断是否栈满
int isFullStack(stack_t *p);
//3.入栈
int InStack(stack_t *p,datatype data);
//4.判断是否为空
int isEpStack(stack_t *p);
//5.出栈
datatype OutStack(stack_t *p);
//6.遍历栈内容
void ShowStack(stack_t *p);
//7.计算栈的长度
int LengthStack(stack_t *p);
//8.获取栈顶数据
datatype TopDataStack(stack_t *p);
//9.清空栈
void ClearStack(stack_t *p);
//10.销毁栈
void DestoryStack(stack_t **sp);
#endif
函数类型:由于要返回的是创建的栈空间的首地址,所以函数类型为重定义后的结构体类型;
思路:首先定义一个结构体指针,指向在堆区新开辟的空间,空间内包含栈的地址,长度和最后一个有效元素的下标;
创建成功后,传入长度给len赋值,表示栈一共有len个数据空间等待赋值;
对于指针变量data,需要开辟数量为len的,数据类型为datatype的堆区空间;
top赋值为-1表示栈为空。
stack_t *CreateStack(int len)
{
//1.定义一个指向结构体的指针;
stack_t *p = (stack_t *)malloc(sizeof(stack_t));
if(NULL == p)
{
printf("CreateStack fail\n");
return NULL;
}
//2.初始化结构体
//2.1.创建栈,首地址等于栈的首地址
p->data = (datatype *)malloc(sizeof(datatype)*len);
if(NULL == p->data)
{
printf("malloc stack fail\n");
return NULL;
}
//2.2.传入栈的长度
p->len = len;
//2.3.空栈
p->top = -1;
return p;
}
思路:栈具有只在一头进出,数据先进后出(FILO),后进先出(LIFO)的特点;
实现入栈的操作:每一次入栈,都先让top向后移动一位(因为top初始值为-1),然后将top目前所在位置赋值。
//3.入栈,只能在一头进出
int InStack(stack_t *p,datatype data)
{
//1.容错判断
if(isFullStack(p))
{
printf("InsertIntoStack fail\n");
return -1;
}
//2.栈针先后移
p->top++;
//3.数据入栈
p->data[p->top] = data;
return 0;
}
思路:出栈,即为将栈中的内容按FILO的特点输出,所以函数需要定义为输出的数据对应的数据类型;然后定义一个对应数据类型的临时变量接收要出栈的数据,随后将top减一,然后返回临时变量;
也可以使用一个return语句完成三行代码的功能。
//5.出栈
datatype OutStack(stack_t *p)
{
if(isEpStack(p))
{
printf("OutStack fail\n");
return -1;
}
/* datatype q = p->data[p->top];
p->top--;
return q; */
return p->data[p->top--];
}
思路:1.清空
清空栈,只需要对栈的top重新赋值为-1;虽然栈中的值还存在,但是我们可以通过重新对栈赋值进行覆盖,所以说只更新top的值,可以视作对栈进行清空;
2.销毁
销毁栈是对栈的内存空间的内容进行修改,所以使用函数时,需要进行地址传递,所以形参需要定义为二级指针来接收一级指针的地址;
先对结构体中的创建的data内存区域进行释放,然后再释放结构体本身,再将其指向空,避免野指针的出现。
//9.清空栈
void ClearStack(stack_t *p)
{
p->top = -1;
}
//10.销毁栈
void DestoryStack(stack_t **sp)
{
free((*sp)->data);
free(*sp);
*sp = NULL;
}
#include "stack.h"
//1.创建空栈
stack_t *CreateStack(int len)
{
//1.定义一个指向结构体的指针;
stack_t *p = (stack_t *)malloc(sizeof(stack_t));
if(NULL == p)
{
printf("CreateStack fail\n");
return NULL;
}
//2.初始化结构体
//2.1.创建栈,首地址等于栈的首地址
p->data = (datatype *)malloc(sizeof(datatype)*len);
if(NULL == p->data)
{
printf("malloc stack fail\n");
return NULL;
}
//2.2.传入栈的长度
p->len = len;
//2.3.空栈
p->top = -1;
return p;
}
//2.判断是否栈满
int isFullStack(stack_t *p)
{
return p->len == p->top + 1;
}
//3.入栈,只能在一头进出
int InStack(stack_t *p,datatype data)
{
//1.容错判断
if(isFullStack(p))
{
printf("InsertIntoStack fail\n");
return -1;
}
//2.栈针先后移
p->top++;
//3.数据入栈
p->data[p->top] = data;
return 0;
}
//4.判断是否为空
int isEpStack(stack_t *p)
{
return p->top == -1;
}
//5.出栈
datatype OutStack(stack_t *p)
{
if(isEpStack(p))
{
printf("OutStack fail\n");
return -1;
}
/* datatype q = p->data[p->top];
p->top--;
return q; */
return p->data[p->top--];
}
//6.遍历栈内容
void ShowStack(stack_t *p)
{
int i;
for(i = 0;i <= p->top;i++)
{
printf("%d ",p->data[i]);
}
putchar(10);
}
//7.计算栈的长度
int LengthStack(stack_t *p)
{
if(isEpStack(p))
{
printf("isEpStack\n");
return -1;
}
return p->top+1;
}
//8.获取栈顶数据
datatype TopDataStack(stack_t *p)
{
if(isEpStack(p))
{
printf("isEpStack\n");
return -1;
}
return p->data[p->top];
}
//9.清空栈
void ClearStack(stack_t *p)
{
p->top = -1;
}
//10.销毁栈
void DestoryStack(stack_t **sp)
{
free((*sp)->data);
free(*sp);
*sp = NULL;
}
如果本文中存在代码逻辑,代码完善,解释不通或不清楚的错误,还请批评指正。