C语言实现数组栈的代码示例

 更新时间:2024年07月28日 09:59:34   作者:池央  
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,本文给大家介绍了C语言实现数组栈的代码示例,需要的朋友可以参考下

栈的概念及结构

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

栈的定义

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;//数组
	int _top; // 栈顶,类似顺序表中的_size
	int _capacity; // 容量
}Stack;

对栈的操作

栈初始化

_top可以初始化为0,此时栈顶元素是_top-1的位置

_top也可以初始化为1,此时栈顶元素就是_top的位置

初始化为0

初始化为1

// 初始化栈
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}

压栈(入栈)

// 入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//扩容
	if (ps->_capacity == ps->_top)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[ps->_top++] = data;
}

出栈

void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	
	ps->_top--;
}

取栈顶元素

STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->_a[ps->_top-1];
}

判断栈是否为空

bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;
}

栈的长度

_top初始化为0,此时的_top的大小刚好就是栈的长度

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

栈销毁

void StackDestroy(Stack* ps)
{
	assert(ps);
	ps->_capacity = ps->_top = 0;
	free(ps->_a);
	ps->_a = NULL;
}

完整总代码

头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;//数组
	int _top; // 栈顶,类似顺序表中的_size
	int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);

函数定义

#include"Stack.h"
// 初始化栈
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//扩容
	if (ps->_capacity == ps->_top)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[ps->_top++] = data;
}
// 出栈
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	
	ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->_a[ps->_top-1];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;
}
// 销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	ps->_capacity = ps->_top = 0;
	free(ps->_a);
	ps->_a = NULL;
}

测试

#include"Stack.h"
void test()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
 
	while (StackSize(&s)>0)
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}
	StackDestroy(&s);
}
int main()
{
	test();
	return 0;
}

到此这篇关于C语言实现数组栈的代码示例的文章就介绍到这了,更多相关C语言数组栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析int*p[ ]与int(*p)[ ]的区别

    浅析int*p[ ]与int(*p)[ ]的区别

    以下是对int*p[ ]与int(*p)[ ]的区别进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • windows下安装QT及visual studio 2017搭建开发环境

    windows下安装QT及visual studio 2017搭建开发环境

    这篇文章主要介绍了windows下安装QT及visual studio 2017搭建开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • QT编写tcp通信工具(Client篇)

    QT编写tcp通信工具(Client篇)

    这篇文章主要介绍了QT编写tcp通信工具,适用于Client端,类似网上常见的网络调试工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言中的数据类型详解

    C语言中的数据类型详解

    在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式,本文将详细给大家介绍一下C语言中的基本数据类型,感兴趣的同学可以参考下
    2023-05-05
  • C++11新特性之变长参数模板详解

    C++11新特性之变长参数模板详解

    本文主要介绍了C++11变长参数模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • C语言实现简单的定时器

    C语言实现简单的定时器

    这篇文章主要为大家详细介绍了C语言实现简单的定时器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Qt中定时器 QTimerEvent 和 QTimer的使用

    Qt中定时器 QTimerEvent 和 QTimer的使用

    Qt框架中的定时器功能主要包括两种实现方式,包括QTimerEvent和QTimer,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • C++11中R字符串的作用小结

    C++11中R字符串的作用小结

    这篇文章主要介绍了C++11中R字符串的作用小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • C++入门之vector的底层实现详解

    C++入门之vector的底层实现详解

    这篇文章主要为大家介绍了C++入门之vector的底层实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C++实现简易万年历

    C++实现简易万年历

    这篇文章主要为大家详细介绍了C++实现简易万年历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论