一、基础知识
栈:栈是一个后进先出的线性表,它要求只在表尾进行删除和插入操作。
所谓的栈就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制:
1.栈的元素只能“后进先出”。
2.栈的操作只能在这个线性表的表尾进行。
3.对于栈来说,表尾称为栈顶(top),相应的表头称为栈尾(bottom)。
二、栈的顺序存储结构
typedef int ElemType;typedef struct{ElemType *base; //指向栈底的指针变量ElemType *top; //指向栈顶的指针变量int stackSize; //栈当前可用最大容量}sqStack;
2.1 创建一个栈
#define STACK_INIT_SIZE 100void InitStack(sqStack *s){s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if (!s->base){exit(0);}s->top = s->base; //最开始栈顶就是栈底s->stackSize = STACK_INIT_SIZE;}
2.2 入栈操作
#define STACKINCREMENT 10void Push(sqStack *s, ElemType e){if (s->top - s->base == s->stackSize){s->base = (ElemType *)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT)*sizeof(ElemType)); //realloc对malloc申请的内存空间进行动态调整if (!s->base){exit(0);}s->top = s->base + s->stackSize; //设置栈顶s->stackSize = s->stackSize + STACKINCREMENT; //设置栈的最大容量}*(s->top) = e;s->top++;}
2.3 出栈操作
void Pop(sqStack *s, ElemType *e){if (s->top == s->base) //栈空空如也{return;}*e = *--(s->top); //指向栈顶的位置是没有东西的}
2.4 清空一个栈
所谓清空一个栈,就是将栈中的元素全部作废,但栈本身物理空间并不发生改变(不是销毁)。
void ClearStack(sqStack *s){s->top = s->base;}
2.5 销毁一个栈
销毁一个栈和清空一个栈不同,销毁一个栈要释放掉该栈所占据的物理内存空间。
void DestroyStack(sqStack *s){int i, len;len = s->stackSize;for (i = 0; i < len; i++){free(s->base);s->base++;}s->base = s->top = NULL;s->stackSize = 0;}
2.6 计算一个栈的当前容量
计算栈的当前容量就是计算栈中元素的个数,栈的最大容量是指该栈占据内存空间的大小,其值是s.stackSize,它与栈的当前容量不是一个概念。
int StackLen(sqStack *s){return s->top - s->base;}
本文详细介绍了栈这种数据结构的基础知识,包括栈的概念、特点及其实现方式。文章深入讲解了栈的顺序存储结构,并提供了创建栈、入栈、出栈等核心操作的具体实现方法。

被折叠的 条评论
为什么被折叠?



