当前位置: 首页 > news >正文

链式栈和线性栈

1. 线性栈(顺序栈)

结构定义‌:
#include <iostream>
using namespace std;#define MAX_SIZE 100  // 预定义最大容量// 线性栈结构体
typedef struct {int* data;        // 存储数据的数组int top;          // 栈顶指针(初始化为-1)int capacity;     // 当前栈的最大容量
} SeqStack;// 初始化栈
void InitSeqStack(SeqStack& S) {S.data = new int[MAX_SIZE];S.top = -1;S.capacity = MAX_SIZE;
}// 销毁栈(释放内存)
void DestroySeqStack(SeqStack& S) {delete[] S.data;S.top = -1;S.capacity = 0;
}

常见操作‌:
// 入栈
bool PushSeqStack(SeqStack& S, int x) {if (S.top == S.capacity - 1) {// 栈满时自动扩容(示例中扩容为原大小的2倍)int newCapacity = S.capacity * 2;int* newData = new int[newCapacity];for (int i = 0; i <= S.top; i++) {newData[i] = S.data[i];}delete[] S.data;S.data = newData;S.capacity = newCapacity;}S.data[++S.top] = x;  // 栈顶指针先增1,再赋值return true;
}// 出栈
bool PopSeqStack(SeqStack& S, int& x) {if (S.top == -1) {cout << "栈空,无法出栈!" << endl;return false;}x = S.data[S.top--];  // 先取栈顶元素,再减1return true;
}// 取栈顶元素
bool GetTopSeqStack(SeqStack& S, int& x) {if (S.top == -1) return false;x = S.data[S.top];return true;
}// 判空
bool IsEmptySeqStack(SeqStack& S) {return S.top == -1;
}

2. 链栈

结构定义‌:
#include <iostream>
using namespace std;// 链栈节点结构体
typedef struct LinkNode {int data;struct LinkNode* next;
} LinkNode;// 链栈结构体(通过头指针管理)
typedef struct {LinkNode* top;   // 栈顶指针
} LinkStack;// 初始化栈
void InitLinkStack(LinkStack& S) {S.top = NULL;    // 初始化为空栈
}// 销毁栈(释放所有节点)
void DestroyLinkStack(LinkStack& S) {LinkNode* p = S.top;while (p) {LinkNode* tmp = p;p = p->next;delete tmp;}S.top = NULL;
}
常见操作‌:
// 入栈
bool PushLinkStack(LinkStack& S, int x) {LinkNode* newNode = new LinkNode;if (!newNode) {cout << "内存分配失败!" << endl;return false;}newNode->data = x;newNode->next = S.top;  // 新节点指向原栈顶S.top = newNode;        // 更新栈顶指针return true;
}// 出栈
bool PopLinkStack(LinkStack& S, int& x) {if (!S.top) {cout << "栈空,无法出栈!" << endl;return false;}LinkNode* tmp = S.top;    // 保存栈顶节点x = tmp->data;           // 取栈顶数据S.top = S.top->next;     // 更新栈顶指针delete tmp;              // 释放旧栈顶节点return true;
}// 取栈顶元素
bool GetTopLinkStack(LinkStack& S, int& x) {if (!S.top) return false;x = S.top->data;return true;
}// 判空
bool IsEmptyLinkStack(LinkStack& S) {return S.top == NULL;
}

3. 对比总结

特性线性栈(顺序栈)链栈
存储结构数组(连续内存)链表(离散内存)
内存分配静态预分配(可动态扩容)动态分配节点(按需增减)
入栈操作data[++top] = x(可能需扩容)创建新节点并调整指针
出栈操作top--(无需释放内存)释放节点内存
空间复杂度O(n)O(n)(预分配空间)O(n)O(n)(每个节点含指针域)
内存管理整体一次性分配/释放逐个节点分配/释放
适用场景数据量固定或可预估数据量动态变化,内存需求不确定

通过代码对比可以清晰看出:

  • 线性栈‌适合‌确定容量‌或需要‌快速随机访问‌的场景(如函数调用栈)。
  • 链栈‌适合‌动态数据量‌或需要‌灵活内存管理‌的场景(如递归算法)。

相关文章:

  • 服务器在国外国内用户访问慢会影响谷歌排名吗?
  • gnome中删除application中失效的图标
  • (三十)安卓开发中的MVP模式详解
  • 四种阻抗匹配的方式
  • C#—Lazy<T> 类型(延迟初始化/懒加载模式)
  • [wifiI]CCA
  • qemu构建arm环境(AI生成)
  • 用74HC595芯片就可做一个SPI组件
  • 【NLP 68、R-BERT】
  • C 语言开发问题:使用 <assert.h> 时,定义的 #define NDEBUG 不生效
  • Transformer框架解析:从“Attention is All You Need”到现代AI基石
  • 20.3 使用技巧9
  • 回车键监听
  • NLP与社区检测算法的结合:文本中的社区发现
  • OpenCV 图形API(49)颜色空间转换-----将 NV12 格式的图像数据转换为 BGR 颜色空间函数NV12toBGR()
  • Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍
  • flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
  • WINDOWS下使用命令行读取本地摄像头FFMPEG+DirectShow,ffplay直接播放摄像头数据
  • 安装ntfs硬盘系统时,报错Error: Unable to find a match: epel-release的解决方法
  • Federated Feature Augmentation and Alignment
  • 中汽协发布规范驾驶辅助宣传与应用倡议书
  • 人民日报:对科研不端行为加大惩处力度,让造假成本远高于收益
  • 甘肃古浪县发生3.0级地震,未接到人员伤亡和财产损失报告
  • “一城双白金”就在脚下!这场半马将以最高标准打造
  • 杜甫、韦应物背后的世家大族,在这个展览上一览传奇
  • 新消费观察 | 重点深耕,外资科技企业继续看好中国发展