【数据结构-栈】栈的基本操作
文章目录
- 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;
}
【数据结构-栈】栈的基本操作相关推荐
- 数据结构之【栈】的基本操作C语言实现
引题: 很多人都把[栈]描述成[弹匣],但我总感觉有点不恰当,因为弹匣从上端[装弹]之后,子弹总是在匣的上层:而元素[进栈]之后,总在栈的下面. 我觉得还是描述成[从下往上 ...
- 数据结构动态顺序字符串基本操作实验_技术连载:数据结构 - 栈
栈 只有一个口,可以进数据也可以出数据,一种典型的先进后出.后进先出的数据结构: 栈 栈的基本操作 入栈 入栈操作需要考虑当前栈是否以及满了,如果满了是选择扩容还是返回入栈失败: 入栈成功则需要更新栈 ...
- 天勤数据结构代码——栈基本操作
顺序栈 typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释.int top; //栈顶下标( ...
- c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...
上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...
- # 数据结构---1.栈的实现
数据结构-1.栈的实现 注:虽然学完了一遍栈的应用,但我还是不能给出关于栈的定义.我能理解它作为一种记录数据或者删除数据的一种操作.但是,栈解决了什么问题,有什么注意事项,还有什么高阶操作,我暂时也不 ...
- 栈——栈的基本概念和基本操作
文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...
- C语言【数据结构】栈和队列【OJ题(C++)、选择题】
目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...
- Java数据结构之栈详解
栈的定义: 栈(stack)是一种用于存储数据的简单数据结构.栈一个有序线性表,只能在表的一端(PS:栈顶)执行插人和删除操作.最后插人的元素将被第一个删除.所以,栈也称为后进先出(Last In F ...
- 数据结构:栈「详解」
目录 一,栈的定义 二,栈的基本操作 1,顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2,链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三,栈的应用 1,函数递归调用 ...
- [数据结构] python 栈的介绍
一.栈 栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除的列表. 栈的特点:后进先出LIFO(last-in,first-out) 栈的概念:栈顶(其实也就是列表最后一个元素位置). ...
最新文章
- linux ping程序设计与实现,一步步学Linux网络编程--ping命令的实现分析
- ACM网络赛金华赛区的一道关于树的题:Family Name List
- 疯狂python讲义视频 百度云-疯狂Python讲义 PDF 含源码工具版
- 本田crv混动操作手册_【广汽本田】不只是奶爸车 新出行试驾本田奥德赛锐混动...
- eq相等 ne、neq不相等 EL表达式
- FreeImage 结合 VB6 使用技巧
- matlab元胞元素_MATLAB元胞数组(cell)知识
- 缺少计算机所需的介质程序,win10系统UEFi安装提示“缺少计算机所需的介质驱动程序”的图文方案...
- 如何面对大容量的数据存储
- matlab画带有正态密度曲线的直方图
- pacman 查询_Pacman 命令记录
- linux 定时任务 非root,linux下的计划任务——只执行一次的定时任务,
- iPhone备忘录删了怎么恢复?恢复备忘录的两大方法!
- java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
- 新一代的无线通信技术(转)
- (六) 数据结构 - 快速排序
- Unable to delete file/directory
- 解决浏览器突然上不了网的问题
- linux增加预读缓存区大小,Linux blockdev命令设置文件预读大小介绍
- 解决华硕飞行堡垒8开机蓝屏问题