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

链式栈和线性栈

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)(每个节点含指针域)
内存管理整体一次性分配/释放逐个节点分配/释放
适用场景数据量固定或可预估数据量动态变化,内存需求不确定

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

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

相关文章:

  • WebForms Validation
  • Spark SQL核心解析:大数据时代的结构化处理利器
  • 【基于WSAAsyncSelec模型的通信程序设计】
  • 云原生与AI的关系是怎么样的?
  • Jinja2 内置变量和函数详解
  • VScode-py环境
  • 【JS】计算任意字符串的像素宽度(px)
  • VR、AR、互动科技:武汉数字展馆制作引领未来展览新体验
  • 单例模式(线程安全)
  • Docker Compose 使用实例
  • 【漫话机器学习系列】214.停用词(Stop Words)
  • 查看MAC 地址以及简单了解
  • CHAPTER 11 A Pythonic Object
  • 定期检查滚珠丝杆的频率是多久?
  • Rust: 从内存地址信息看内存布局
  • OpenCV 图形API(44)颜色空间转换-----将图像从 BGR 色彩空间转换为 RGB 色彩空间函数BGR2RGB()
  • XMC4800 芯片深度解读:架构、特性、应用与开发指南
  • OpenCV中的图像旋转方法详解
  • 特征选择与类不平衡处理
  • aws服务--S3介绍使用代码集成
  • Missashe考研日记-day23
  • 在Ubuntu下用Chrony做主从机时间同步
  • 栈和字符串,力扣.43.字符串相乘力扣1047.删除字符串中的所有相邻重复项力扣.844比较含退格的字符串力扣227.基本计算器II
  • 《马尼拉》桌游期望计算器
  • Ubuntu下展锐刷机工具spd_dump使用说明
  • Python3网络爬虫开发--爬虫基础
  • Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
  • 每天学一个 Linux 命令(30):cut
  • 【React】搜索时高亮被搜索选中的文案
  • 大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结