数据结构 栈的简单理解和基本操作

Posted 林慢慢i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 栈的简单理解和基本操作相关的知识,希望对你有一定的参考价值。

前言:本章介绍的主要内容是数据结构中栈的概念和栈的基本操作,包括:栈结构的定义、初始化、容量检查、判空、入栈、出栈、读取栈顶元素、读取栈内元素个数、栈的销毁等操作的具体实现。



1.为什么需要栈?

1.1栈的概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。**栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。


2.栈项目文件搭建

程序名功能
Stack.h定义结构体,引头文件,函数的声明
Stack.c各个功能函数的定义
test.c测试函数功能

栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除,后下文将逐一实现。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。


2.1 栈结构的代码实现

typedef int STDataType;  

typedef struct Stack
{
    STDataType* data; //接收动态开辟的数组地址
    int top;      //栈顶
    int capacity; //容量
}ST; 

2.2 栈的初始化

就是初始化成空栈,把 data指针置为NULL, topcapacity初始化为0.

void StackInit(ST* ps)   
{
    assert(ps); //传进来的地址一定不能为空
    
    ps->data = NULL;
    ps->top = ps->capacity = 0;
}

2.3 栈的检查容量操作

当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。

提问:怎么判断容量满了呢?

答案:ps->top == ps->capacity.

void StackCheckCapacity(ST* ps)
{
    assert(ps);  //ps不可为空
    
    if(ps->top == ps->capacity)
    {
        //注意细节,如果此时容量为0,就给4个,否则就翻倍
        int newcapacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity ); 
        
        STDataType* newdata = (STDataType*)realloc(ps->data,newcapacity*sizeof(STDataType));
        
        if(newdata == NULL)
        {
            perror("错误原因:");
            exit(-1);
        }
        ps->data = newdata; //重新交接给ps->data
        
        ps->capacity = newcapacity;
    }
}

2.4 栈的判空操作

当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。

void StackPush(ST* ps,STDataType elem)
{
    assert(ps); //ps不能为空
    
    return ps->top == 0; //等于0就返回1,
}

2.5 栈的入栈操作

入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。

void StackPush(ST* ps,STDataType elem)
{
    assert(ps); 
    
    StackCheckCapacity(ps); //检查容量是否满了
    
    ps->data[ps->top++] = elem;
}

2.6 栈的出栈操作

出栈时我们首先要判断栈是否为空栈,然后只需要ps->top减去1就行。

void StackPop(ST* ps)
{
    assert(ps);
    
    assert(!StackEmpty(ps));
    
    ps->top--;
}

2.7 栈的读取元素数量操作

直接把ps->top的值返回

size_t StackSize(ST* ps)
{
    assert(ps);
    
    return ps->top;
}

2.8 栈的读取栈顶操作

直接通过ps->top-1把值返回

STDataType StackTop(ST* ps)
{    
	assert(ps);        
	assert(!StackEmpty(ps));        
	return ps->data[ps->top - 1];
}

2.9 栈的销毁操作

直接free

void StackDestroy(ST* ps)
{    
	assert(ps);    
	free(ps->data);
	//当ps->data是NULL时候,free什么都不会做    
	ps->data = NULL;    
	ps->top = ps->capacity = 0;
}

3.源码链接

栈的代码实现


数据结构的栈内容到此设计结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人

以上是关于数据结构 栈的简单理解和基本操作的主要内容,如果未能解决你的问题,请参考以下文章

数据结构——栈(线性表与链表)

链式栈总结

java堆和栈的理解

数据结构基础学习——栈的概念及代码实现

栈的简单实现-数组实现

栈的简单实现-单链表实现