文章目录

  • 1 顺序表实现栈
    • 1.1 定义
    • 1.2 初始化
    • 1.3 栈空判断
    • 1.4 栈满判断
    • 1.5 出栈
    • 1.6 入栈
    • 1.7 读栈顶元素
  • 2 单向链表实现栈
    • 2.1 定义
    • 2.2 初始化
    • 2.3 栈空判断
    • 2.4 栈满判断
    • 2.5 出栈
    • 2.6 入栈
    • 2.7 读栈顶元素
  • 3 双向链表实现栈
    • 3.1 定义
    • 3.2 初始化
    • 3.3 栈空判断
    • 3.4 栈满判断
    • 3.5 出栈
    • 3.6 入栈
    • 3.7 读栈顶元素

1 顺序表实现栈

两种实现方式:

  • 栈顶指针 top 指向栈顶元素
  • 栈顶指针 top 指向栈顶元素的下一位置

1.1 定义

# define NUM 50 // 栈的容量typedef struct Stack{int data[NUM];int top;
} Stack;

1.2 初始化

  • 栈顶指针 top 指向栈顶元素:
void InitStack (Stack &S){S.top = -1;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
void InitStack (Stack &S){S.top = 0;
}

1.3 栈空判断

  • 栈顶指针 top 指向栈顶元素:
bool EmptyStack (Stack &S){if (S.top == -1) return true;else return false;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
bool EmptyStack (Stack &S){if (S.top == 0) return true;else return false;
}

1.4 栈满判断

  • 栈顶指针 top 指向栈顶元素:
bool FullStack (Stack &S){if (S.top == NUM-1) return true;else return false;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
bool FullStack (Stack &S){if (S.top == NUM) return true;else return false;
}

1.5 出栈

  • 栈顶指针 top 指向栈顶元素:
bool PopStack (Stack &S, int &x){if (S.top == -1) return false;x = S.data[S.top];S.top--;return true;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
bool PopStack (Stack &S, int &x){if (S.top == 0) return false;x = S.data[S.top];S.top--;return true;
}

1.6 入栈

  • 栈顶指针 top 指向栈顶元素:
bool PushStack (Stack &S, const int x){if (S.top == NUM-1) return false;S.top++;S.data[S.top] = x;return true;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
bool PushStack (Stack &S, const int x){if (S.top == NUM) return false;S.top++;S.data[S.top] = x;return true;
}

1.7 读栈顶元素

  • 栈顶指针 top 指向栈顶元素:
bool GetStackTop (Stack &S, int &x){if (S.top == -1) return false;x = S.data[S.top];return true;
}
  • 栈顶指针 top 指向栈顶元素的下一位置:
bool GetStackTop (Stack &S, int &x){if (S.top == 0) return false;x = S.data[S.top-1];return true;
}

2 单向链表实现栈

实现方法:

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置(相当于带头结点的链表,头结点正好可以用来记录当前栈存储元素的个数

【注】“栈顶元素在链表表尾”较难实现,因为单向链表只有后继结点。

2.1 定义

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
#define NUM 50 // 栈的容量typedef struct LinkNode{int data;struct LinkNode *next;
} LinkNode, *LinkStack;
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
#define NUM 50 // 栈的容量typedef struct LinkNode{int data;struct LinkNode *next;
} LinkNode, *LinkStack;int count; // 记录栈内当前元素个数

2.2 初始化

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool InitStack (LinkStack &top){top = NULL;count = 0;return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool InitStack (LinkStack &head){head = (LinkNode *) malloc(sizeof(LinkNode));if (head == NULL)return false;head->data = 0; // 用来记录当前栈存储元素的个数head->next = NULL; // 后继结点为空return true;
}

2.3 栈空判断

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
void EmptyStack (LinkStack &top){if (top == NULL)return true;return false;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
void EmptyStack (LinkStack &head){if (head->data == 0)return true;return false;
}

2.4 栈满判断

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:需要借助外部变量 count 实现
void FullStack (LinkStack &head){if (count == NUM)return true;return false;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
void FullStack (LinkStack &head){if (head->data == NUM)return true;return false;
}

2.5 出栈

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool PopStack (LinkStack &top, int &x){LinkNode *topNext; // 记录栈顶结点(表头结点)的下一个结点if (top == NULL)return false;x = top->data;topNext = top->next; // 记录栈顶结点(表头结点)的下一个结点free(top);count--; // 栈内元素个数减少return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool PopStack (LinkStack &head, int &x){LinkNode *top; // 记录表头结点的下一个结点(即栈顶结点)LinkNode *topNext; // 记录栈顶结点的下一个结点if (head->data == 0)return false;top = head->next; // 记录表头结点的下一个结点(即栈顶结点)topNext = top->next; // 记录栈顶结点的下一个结点x = top->data;free(top);head->data--; // 栈内元素个数减少head->next = topNext;return true;
}

2.6 入栈

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool PushStack (LinkStack &top, const int x){LinkNode *newTop; // 新结点newTop = (LinkNode *) malloc(sizeof(LinkNode));newTop->data = x;newTop->next = top; // 新结点的后继结点指向当前栈顶结点count++; // 栈内元素增加top = newTop; // 新结点作为新的栈顶结点return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool PushStack (LinkStack &head, const int x){LinkNode *top; // 记录表头结点的下一个结点(即栈顶结点)LinkNode *newTop; // 新结点if (head->data == NUM)return false;top = head->next; // 记录表头结点的下一个结点(即栈顶结点)topNext = top->next; // 记录栈顶结点的下一个结点newTop = (LinkNode *) malloc(sizeof(LinkNode));newTop->data = x;newTop->next = top; // 新结点的下一个结点为当前栈顶结点head->data++; // 栈内元素个数增加head->next = newTop; // 新结点作为表头结点的后继结点return true;
}

2.7 读栈顶元素

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool GetStackTop(LinkStack top, int &x){if (top == NULL)return false;x = top->data;return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool GetStackTop(LinkStack head, int &x){LinkNode *top = head->next;if (head->data == 0)return false;x = top->data;return true;
}

3 双向链表实现栈

实现方法:

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置(相当于带头结点的链表,头结点正好可以用来记录当前栈存储元素的个数

【注】“栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素的下一位置”没有意义。

3.1 定义

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
typedef struct LinkNode{int data;struct LinkNode *prev;struct LinkNode *next;
} LinkNode, *LinkStack;int count;
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
typedef struct LinkNode{int data;struct LinkNode *prev;struct LinkNode *next;
} LinkNode, *LinkStack;

3.2 初始化

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool InitStack (LinkStack &top){top = NULL;count = 0;return true;
}
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
bool InitStack (LinkStack &top){top = NULL;count = 0;return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool InitStack (LinkStack &head){head = (LinkNode *) malloc(sizeof(LinkNode));if (head == NULL)return false;head->data = 0; // 用来记录当前栈存储元素的个数head->prev = NULL; // 前驱结点为空head->next = NULL; // 后继结点为空return true;
}

3.3 栈空判断

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
void EmptyStack (LinkStack &top){if (top == NULL)return true;return false;
}
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
void EmptyStack (LinkStack &top){if (top == NULL)return true;return false;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
void EmptyStack (LinkStack &head){if (head->data == 0)return true;return false;
}

3.4 栈满判断

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:需要借助外部变量 count 实现
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:需要借助外部变量 count 实现
void FullStack (LinkStack &head){if (count == NUM)return true;return false;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
void FullStack (LinkStack &head){if (head->data == NUM)return true;return false;
}

3.5 出栈

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool PopStack (LinkStack &top, int &x){LinkNode *topNext; // 记录栈顶结点(表头结点)的下一个结点if (top == NULL)return false;x = top->data;topNext = top->next; // 记录栈顶结点(表头结点)的下一个结点free(top);count--; // 栈内元素个数减少topNext->prev = NULL;top = topNext; // 旧栈顶结点(表头结点)的下一个结点成为新的栈顶结点return true;
}
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
bool PopStack (LinkStack &top, int &x){LinkNode *topPrev; // 记录栈顶结点(表尾结点)的上一个结点if (top == NULL)return false;x = top->data;topPrev = top->prev; // 记录栈顶结点(表尾结点)的上一个结点free(top);count--; // 栈内元素个数减少topPrev->next = NULL;top = topNext; // 旧栈顶结点(表尾结点)的上一个结点成为新的栈顶结点return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool PopStack (LinkStack &head, int &x){LinkNode *top; // 记录表头结点的下一个结点(即栈顶结点)LinkNode *topNext; // 记录栈顶结点的下一个结点if (head->data == 0)return false;top = head->next; // 记录表头结点的下一个结点(即栈顶结点)topNext = top->next; // 记录栈顶结点的下一个结点x = top->data;free(top);head->data--; // 栈内元素个数减少head->next = topNext; // 旧栈顶结点(表头结点)的下一个结点成为新的栈顶结点topNext->prev = head; // 新栈顶结点的上一个结点为头结点return true;
}

3.6 入栈

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool PushStack (LinkStack &top, const int x){LinkNode *newTop; // 新结点newTop = (LinkNode *) malloc(sizeof(LinkNode));newTop->data = x;newTop->prev = NULL;newTop->next = top; // 新结点的后继结点指向当前栈顶结点count++; // 栈内元素个数增加top->prev = newTop; // 当前栈顶结点的前驱结点为新结点top = newTop; // 新结点作为新的栈顶结点return true;
}
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
bool PushStack (LinkStack &top, const int x){LinkNode *newTop; // 新结点newTop = (LinkNode *) malloc(sizeof(LinkNode));newTop->data = x;newTop->prev = top; // 新结点的后继结点指向当前栈顶结点newTop->next = NULL;count++; // 栈内元素个数增加top->next = newTop; //当前栈顶结点的后继结点为新结点top = newTop; // 新结点作为新的栈顶结点return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool PushStack (LinkStack &head, const int x){LinkNode *top; // 记录表头结点的下一个结点(即栈顶结点)LinkNode *newTop; // 新结点if (head->data == NUM)return false;top = head->next; // 记录表头结点的下一个结点(即栈顶结点)newTop = (LinkNode *) malloc(sizeof(LinkNode));newTop->data = x;newTop->prev = head; // 新结点的前驱结点为头结点newTop->next = top; // 新结点的后继结点为当前栈顶结点head->data++; // 栈内元素个数增加top->prev = newTop; // 当前栈顶结点的前驱结点指向新结点head->next = newTop; // 新结点作为表头结点的后继结点return true;
}

3.7 读栈顶元素

  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素:
bool GetStackTop(LinkStack top, int &x){if (top == NULL)return false;x = top->data;return true;
}
  • 栈顶元素在链表表尾,且栈顶指针 top 指向栈顶元素:
bool GetStackTop(LinkStack top, int &x){if (top == NULL)return false;x = top->data;return true;
}
  • 栈顶元素在链表表头,且栈顶指针 top 指向栈顶元素的下一位置:
bool GetStackTop(LinkStack head, int &x){LinkNode *top = head->next;if (head->data == 0)return false;x = top->data;return true;
}

【数据结构-栈】栈的基本操作相关推荐

  1. 数据结构之【栈】的基本操作C语言实现

    引题:        很多人都把[栈]描述成[弹匣],但我总感觉有点不恰当,因为弹匣从上端[装弹]之后,子弹总是在匣的上层:而元素[进栈]之后,总在栈的下面.        我觉得还是描述成[从下往上 ...

  2. 数据结构动态顺序字符串基本操作实验_技术连载:数据结构 - 栈

    栈 只有一个口,可以进数据也可以出数据,一种典型的先进后出.后进先出的数据结构: 栈 栈的基本操作 入栈 入栈操作需要考虑当前栈是否以及满了,如果满了是选择扩容还是返回入栈失败: 入栈成功则需要更新栈 ...

  3. 天勤数据结构代码——栈基本操作

    顺序栈 typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释.int top; //栈顶下标( ...

  4. c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...

    上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...

  5. # 数据结构---1.栈的实现

    数据结构-1.栈的实现 注:虽然学完了一遍栈的应用,但我还是不能给出关于栈的定义.我能理解它作为一种记录数据或者删除数据的一种操作.但是,栈解决了什么问题,有什么注意事项,还有什么高阶操作,我暂时也不 ...

  6. 栈——栈的基本概念和基本操作

    文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...

  7. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  8. Java数据结构之栈详解

    栈的定义: 栈(stack)是一种用于存储数据的简单数据结构.栈一个有序线性表,只能在表的一端(PS:栈顶)执行插人和删除操作.最后插人的元素将被第一个删除.所以,栈也称为后进先出(Last In F ...

  9. 数据结构:栈「详解」

    目录 一,栈的定义 二,栈的基本操作 1,顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2,链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三,栈的应用 1,函数递归调用 ...

  10. [数据结构] python 栈的介绍

    一.栈 栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除的列表. 栈的特点:后进先出LIFO(last-in,first-out) 栈的概念:栈顶(其实也就是列表最后一个元素位置). ...

最新文章

  1. linux ping程序设计与实现,一步步学Linux网络编程--ping命令的实现分析
  2. ACM网络赛金华赛区的一道关于树的题:Family Name List
  3. 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
  4. 本田crv混动操作手册_【广汽本田】不只是奶爸车 新出行试驾本田奥德赛锐混动...
  5. eq相等 ne、neq不相等 EL表达式
  6. FreeImage 结合 VB6 使用技巧
  7. matlab元胞元素_MATLAB元胞数组(cell)知识
  8. 缺少计算机所需的介质程序,win10系统UEFi安装提示“缺少计算机所需的介质驱动程序”的图文方案...
  9. 如何面对大容量的数据存储
  10. matlab画带有正态密度曲线的直方图
  11. pacman 查询_Pacman 命令记录
  12. linux 定时任务 非root,linux下的计划任务——只执行一次的定时任务,
  13. iPhone备忘录删了怎么恢复?恢复备忘录的两大方法!
  14. java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
  15. 新一代的无线通信技术(转)
  16. (六) 数据结构 - 快速排序
  17. Unable to delete file/directory
  18. 解决浏览器突然上不了网的问题
  19. linux增加预读缓存区大小,Linux blockdev命令设置文件预读大小介绍
  20. 解决华硕飞行堡垒8开机蓝屏问题

热门文章

  1. PMP考前冲刺2.8 | 2023新征程,一举拿证
  2. 鱼C工作室 零基础学python 第3讲
  3. 腾讯云 TStor 统一存储通过信通院首批文件存储基础能力评测
  4. Nginx上线一个项目并简操
  5. QWidget的几何结构
  6. itunes备份和恢复速度一样吗_Mac技巧分享:如何从加密的iTunes备份中恢复数据?...
  7. 把Google图书嵌入到网站中
  8. oracle metalink获取,Oracle的MetaLink使用
  9. Lua JSON 解析与序列化
  10. Ryzen3700x+R5-230P鲁大师跑分