栈的C语言源码

本文介绍了栈这一数据结构的基本概念、特性以及在C语言中的实现方式,阐述了栈作为后进先出(LIFO)数据结构在函数调用、括号匹配等问题中的应用。文中还详细讲解了栈的初始化、插入和删除操作,并探讨了栈在顺序存储结构中的优势和扩容策略。
摘要由CSDN通过智能技术生成
1.导言(为什么要用栈?)

通常来说,决定采用何种方式来存储数据是非常重要的,这样便于对数据检索时,数据会自动按照某种规定的顺序给出。栈和队列是检索数据的一种常用的数据结构。栈和队列是两种非常重要的数据结构,从数据结构来看,栈和队列也是线性表。是操作受限的线性表,栈只能在一端(栈顶)进行插入和删除,队列只能在一端(队尾)进行插入在另一端(队头)进行删除。但是从数据类型来说,栈和队列是和线性表不大相同两类重要的抽象数据类型。这里,首先重点介绍栈,以及栈的先关操作的c语言实现。栈是按照后进先出(LIFO)的顺序存储和检索数据的高效数据数据结构。它检索元素的顺序与存储元素的顺序相反。栈的一个最常用就是c函数调用,这是模块化编程的一个重要组成部分当在c程序中调用一个函数时,一个包含调用信息的活动记录被压入栈中,这个栈称为程序栈。当调用函数返回时,它的活动记录就会从程序栈中弹出。栈是记录函数调用过程和返回过程的完美模型,因为函数的调用过程与函数的返回过程是相反的,这刚好就是栈后进先出的特性。栈的一个显著特点就是它按照后进先出(LIFO)的方式来存储和删除元素。这就意味着最后一个入栈的元素将会第一个被删除。在计算机中,把元素存入栈中,要往栈中压入"元素,要删除栈中的元素,就要"弹出"元素。可以通过检查栈顶元素(注意这里并不是删除它,只是检索栈顶)来获取栈顶元素的信息。


2.栈的定义(什么是栈?)

栈(stack)是限定仅在表尾进行插入和删除操作的线性表。因此,对栈来说,表尾端有其特需的含义,称为栈顶(top)相应地,表头端称为栈底(bottom),不含任何元素的空表,称为空栈。


3.栈的特性(为什么要用栈?)

栈是按照后进先出的顺序存储和检索数据的数据结构。它检索元素的顺序与存储元素的顺序刚好相反。这种特性使得栈成为程序设计的一种非常有用的工具。如上文提到的c函数调用和返回,括号匹配检测等等只要数据具有按照后进先出的特点 都可以使用栈。


4.栈的定义和实现(怎样用程序设计语言(这里以c语言为例)去实现栈?)

栈是一种线性关系的数据结构。和线性表一样,栈在计算机中的物理存储结构可分为两种 :顺序存储(顺序栈)链式存储(链栈)这里以顺序栈为例。顺序栈,栈的顺序存储结构也就是利用一组地址连续的内存单元依次存放从栈底到栈顶的数据元素同时,设立一个指针top指示栈顶元素在顺序栈中的位置,通常习惯做法,是以top = 0表示空栈,但是c语言中,数组的下标约定也是从0开始,则当用c语言进行设计时,会带来很大的不方便。另一方面,由于栈在使用过程中所需的最大空间难以估计,因此,一般来说,在初始化空栈时,不应该限定栈的最大容量。一个比较合理的办法是:先为栈分配一个基本容量的内存空间,然后在使用的过程中,当栈的空间不够用的时候,再逐段扩大。为此,可以设定两个常量:STACK_INIT_SIZE(存储空间的初始分配容量),和STACKINCREMENT(存储空间分配增量),如是我们可以以下述类型来定义顺序栈。

typedef struct SqStack{
	DataType *base;//指向栈底元素
	DataType *top;//栈顶元素指针
	int stack_size ;//最大存储容量
	

}SqStack;



其中,stacksize指示的是栈当前最大可以存储的元素个数,也就是说栈的最大容量,初始为STACK_INIT_SIZE,当栈满时,每次加上STACKINCREMENT。栈的初始化操作为:按设定的初始分配的内存容量(STACK_INIT_SIZE)进行第一次存储分配,base 可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若 base == NULL,则表明栈结构不存在,top称为栈顶指针,其初值指向栈底。即 top = base = NULL;每当插入一个新的栈顶元素时,指针top+1;删除栈顶元素时,指针top-1;因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

</pre><p></p><pre name="code" class="html">//SqStack.h
#ifndef SQSTACK_H
#define SQSTACK_H

//--------栈的顺序存储结构的结构体————————//
#define STACK_INIT_SIZE 5//顺序栈的初始分配的内存空间
#define STACKINCREMENT 2  //宏,当内存空间不足,每次增长的内存空间

typedef  int DataType ;//将栈中的数据类型抽象化,使其适用于任何类型。

typedef struct SqStack{
	DataType *base;//指向栈底元素
	DataType *top;//栈顶元素指针
	int stack_size ;//最大存储容量
	

}SqStack;

//--------栈的基本操作的函数的数据原型——————//
//初始化栈:构造一个空栈 stack ,是栈其它操作的基础
bool init_stack(SqStack* stack);
//判断栈是否为空
bool stack_is_empty( const SqStack * const stack);
//向栈中压入一个数据*data,使其成为新的栈顶元素
bool stack_push (SqStack *stack,const DataType * const data);
//若栈不空,用data 返回stack的栈顶元素,并返回true,否则返回false
bool stack_top (const SqStack * const stack,DataType *data);
//返回栈stack 中元素的个数,也就是栈的长度
int stack_length (const SqStack *const stack);
//从栈底到栈顶遍历栈中元素,并输出栈中的每一个元素值。
bool stack_traverse( const SqStack * const stack);
//如果栈不空,从栈中删除栈顶元素,并用data 返回
bool stack_pop (SqStack *stack, DataType *data);
//清除栈中元素:执行此操作后,栈stack为空栈
bool clear_stack(SqStack* stack);
//销毁栈:执行此操作后,栈stack不再存在,栈的其它操作都不能进行,除非调用 init_stack(stack)重新生成
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值