顺序栈:基于数组的实现

顺序栈使用数组来存储栈中的元素,通过一个指针Top来标识栈顶位置。

顺序栈的存储结构

c 复制代码
#define MAXSIZE 1024
typedef int DataType;

typedef struct {
    DataType elements[MAXSIZE];  // 存储栈元素的数组
    int Top;                     // 栈顶指针,指向栈顶元素的位置
} SequenStack;

/*
 * MAXSIZE: 栈的最大容量
 * DataType: 栈数据元素的数据类型
 * Top: 指示当前栈顶位置,空栈时Top=-1
 */

顺序栈的基本操作

初始化空栈

c 复制代码
SequenStack *SetNullS(SequenStack *S) {
    S = (SequenStack*)malloc(sizeof(SequenStack));
    S->Top = -1;  // 空栈时Top为-1
    return S;
}

判断栈空

c 复制代码
int EmptyS(SequenStack *S) {
    return (S->Top < 0) ? 1 : 0;  // Top<0表示栈空
}

优化说明:使用三元运算符简化条件判断,提高代码可读性。

入栈操作

c 复制代码
void PushS(SequenStack *S, DataType e) {
    if (S->Top >= MAXSIZE - 1) {
        printf("Stack Overflow: 栈已满,无法插入元素\n");
        return;
    }
    
    S->Top++;                    // 栈顶指针上移
    S->elements[S->Top] = e;     // 在新的栈顶位置存入元素
}

时间复杂度:O(1)

出栈操作

c 复制代码
DataType PopS(SequenStack *S) {
    if (EmptyS(S)) {
        printf("Stack Underflow: 栈为空,无法出栈\n");
        return -1;  // 返回错误值,实际应用中可抛出异常
    }
    
    DataType ret = S->elements[S->Top];  // 保存栈顶元素
    S->Top--;                            // 栈顶指针下移
    return ret;
}

时间复杂度:O(1)

读取栈顶元素

c 复制代码
DataType GetTopS(SequenStack *S) {
    if (EmptyS(S)) {
        printf("Stack is empty: 无法读取栈顶元素\n");
        return -1;
    }
    
    return S->elements[S->Top];  // 返回栈顶元素,不修改栈状态
}

时间复杂度:O(1)

顺序栈的优缺点

优点

  • 随机访问:可以通过下标快速访问任意元素(虽然栈不允许)
  • 空间效率高:没有额外的指针开销
  • 实现简单:操作直观,易于理解和实现

缺点

  • 空间固定:需要预先分配固定大小的存储空间
  • 空间浪费:可能存在大量未使用的空间
  • 溢出风险:当元素数量超过MAXSIZE时发生上溢
相关推荐
CSharp精选营3 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦14 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠15 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾15 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82115 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q15 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒15 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记15 天前
单项不带头不循环链表
数据结构·链表