【数据结构】顺序栈

顺序栈

一、相关概念

  1. 栈和队列是操作受限的线性表,是限定性的数据结构;
  2. 栈分为顺序栈和链式栈
  3. 栈只能在一端进行操作(插入、删除)
  4. 栈是限定仅在表尾进行插入或删除操作的线性表,因此,对栈来说,表尾端具有特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)
  5. 不含元素的空表称为空栈

二、顺序栈的结构

复制代码
typedef struct Stack
{
	int* base; //指向动态内存
	int top; //栈顶指针,实际上是下标
	int stacksize; //栈的总大小
}Stack, *PStack;

三、顺序栈的实现

cpp 复制代码
#define INIT_SIZE 10
//初始化
void InitStack(PStack ps)
{
	assert(ps != NULL);
	ps->base = (int*)malloc(INIT_SIZE * sizeof(int*));
	ps->top = 0;
	ps->stacksize = INIT_SIZE;
}
static bool IsFull(PStack ps)
{
	return ps->top == ps->stack;
}
static void Inc(PStack ps)
{
	ps->stacksize *= 2;
	ps->base = (int*)realloc(ps->base, ps->stacksize * sizeof(int));
	assert(ps->base != NULL); 
}
//入栈操作
bool Push(PStack ps, int val)
{
	assert(ps != NULL);
	if(IsFull)
		Inc(ps);
	ps->base[ps->top++] = val;
	return true;
}
//获取栈顶元素的值,但是不删除
//输出参数
bool GetTop(PStack ps, int *rtval)
{
	assert(ps != NULL);
	if(IsEmpty(ps))
		return false;
	*rtval = ps->base[ps->top - 1];
	return true;
}
//获取栈顶元素的值,但是删除
bool Pop(PStack ps, int *rtval)
{
	assert(ps != NULL);
	if(IsEmpty(ps))
		return false;
	*rtval = ps->base[--ps->top];
	return true;
}
//判空
bool IsEmpty(PStack ps)
{
	return ps->top == 0;
}
//获取栈中有效元素的个数
int GetLength(PStack ps)
{
	assert(ps != NULL);
	return ps->top;
}
//清空所有的数据
void Clear(PStack ps)
{
	assert(ps != NULL);
	ps-> top = 0;
}
//销毁
void Destroy(PStack ps)
{
	assert(ps != NULL);
	free(ps->base);
	ps->base = NULL;
	ps->top = 0;
	ps-> =stacksize;
}

四、顺序栈的总结

  1. 栈的特点:后进后出,后来的反而需要先服务(访问受限的线性表)
  2. 栈又分为顺序栈和链式栈
  3. 本篇顺序栈为不定长的顺序栈,能自动扩容
  4. 栈只能在一端进行插入和删除,插入和删除这一端称之为栈顶,另一端称之为栈底
  5. 顺序栈的栈顶在尾部,因为入栈和出栈的时间复杂度为O(1)
相关推荐
方华世界10 分钟前
企业级Java AI Agent应用平台
java·开发语言·人工智能
2301_8002561126 分钟前
数据结构基础期末复习例题
数据结构·算法
折哥的程序人生 · 物流技术专研39 分钟前
第8篇:模板方法模式的优缺点与面试高频考点
java·设计模式·面试·模板方法模式·行为型模式·优缺点·扩充系列
变量未定义~1 小时前
单调栈-四元组问题
数据结构·算法
冷小鱼1 小时前
AI Agent 核心算法:任务规划(Planning)的深度技术解析
人工智能·算法·planning
退休倒计时1 小时前
【每日一题】LeetCode 78. 子集 TypeScript
算法·leetcode·typescript
旖-旎1 小时前
《LeetCode 978 最长湍流子数组 || LeetCode 139 单词拆分》
c++·算法·leetcode·动态规划
人道领域1 小时前
【0-1的agent进阶篇】Prompt 与上下文工程
java·开发语言·prompt·mcp
cxr8281 小时前
第16章 跨域迁移与能力融合——从专家到通才
人工智能·算法·智能体·hermes
学究天人1 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数