栈–C语言代码实现
1.线性表:
首先了解一下线性表的一些基础知识。
概念: n个数据元素的有序序列。
结构特点:
-
存在唯一的一个被称为”第一个“的数据元素。
-
存在唯一的一个被称为”最后一个“的数据元素。
-
除第一个元素外,集合中的每个元素都只有一个前驱。
-
除最后一个元素外,集合中的每个元素都只有一个后继。
顺序表示:
用一组地址连续的存储单元依次存储线性表中的数据元素。
线性表的这种机内表示称为线性表的顺序存储或顺序印象,这种存储结构的线性表为顺序表。
通常用数组来描述顺序存储结构。
结构特点是逻辑关系上相邻的两个元素在物理位置上也相邻。
结构定义:
#define LIST_INIT_SIZE 100 //线性表存储表空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef stuct { ElemType *elem; //存储空间基址 int length; //当前长度 int listSize; //当前分配的存储容量 }
链式表示和实现
用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的。)
称作线性链表或者单链表
这种存储结构为非顺序映像或者链式映像。
typedef struc LNode { Elmtype data; struct LNode *next; }LinkList;
循环列表:
尾结点的指针指向头结点,整个列表形成一个环。
循环条件为 指针是否指向了头指针。
双向链表:
typedef struct DuLNode { ElemTYpe data; struct DuLNode *prior; struct DuLNode *next; }DuLinkList
了解了一些基础知识后我们接下来进行栈的基本了解和实现
2.栈
概念:限定仅在表位进行插入或删除操作的线性表。对于栈来说,表尾端成为栈顶,表头端成为栈底。
特点:栈的修改是按照后进先出的原则进行的,因此又称为**后进先出(last in first out)**的线性表(简称LIFO结构)。
2.1 栈的顺序存储
顺序栈:利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
代码实现:
/*
* 栈是一种线性表的数据结构 LIFO 后进先出
* 栈的顺序实现
*/
#include<stdbool.h>
#include <stdlib.h>
#define INIT_STACK_SIZE 100 //栈初始化深度
#define INCREMENT_SIZE 10 //每次动态申请栈大小
typedef int ElemType ;
typedef struct STACK
{
ElemType* base; //指向栈底元素
ElemType* top; //指向栈顶元素
int stacksize; //栈的深度
}Stack;
/*
* 初始化栈
*/
bool InitStack(Stack * sp);
/*
* 清空栈
*/
bool clearStack(Stack* sp);
/*
* 插入元素到栈中
*/
bool push(Stack* sp, ElemType e);
/*
* 将栈顶元素弹出,删除栈顶元素,并用e返回值
*/
bool pop(Stack* sp, ElemType * e);
/*
* 返回栈顶元素,只返回不删除
*/
bool getTop(Stack * sp,ElemType e);
/*
* 将函数作用于每个元素上
*/
bool StackTraverse(Stack* sp, void(*pFun)(ElemType e));
/*
* 每个元素加一
*/
void element_add(ElemType e);
/*
* 具体实现部分
*/
bool InitStack(Stack* sp)
{
ElemType* base = (