数据结构之顺序栈的操作(C语言附详细代码与解释)

目录

一,seq_stack.h头文件代码:

二,seq_stack.c文件内

1.创建空栈

2.入栈

3.出栈

4.栈的清空和销毁

三,详细代码


 

 

      数据结构中的栈,有顺序栈与链式栈两种,本文主要分享顺序栈的创建,入栈出栈等基本操作,详细代码与解释,仅供学习与参考,转载请标明出处。

一,seq_stack.h头文件代码:

#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

二,seq_stack.c文件内

1.创建空栈

函数类型:由于要返回的是创建的栈空间的首地址,所以函数类型为重定义后的结构体类型;

思路:首先定义一个结构体指针,指向在堆区新开辟的空间,空间内包含栈的地址,长度和最后一个有效元素的下标;

创建成功后,传入长度给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;
}          

2.入栈

思路:栈具有只在一头进出,数据先进后出(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;
}

3.出栈

思路:出栈,即为将栈中的内容按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--];
}

4.栈的清空和销毁

思路: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;
}

如果本文中存在代码逻辑,代码完善,解释不通或不清楚的错误,还请批评指正。

 

你可能感兴趣的:(数据结构,C语言,c语言,开发语言,数据结构)