天勤数据结构代码——栈基本操作
顺序栈
typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释。int top; //栈顶下标(指针)
};
链栈节点
typedef struct LNode {int data; //数据域struct LNode *next; //指针域
};
初始化顺序栈
void initStack(SqStack &st) {st.top = -1;
}
判断栈空 如果为空则返回 1,
int isEmpty(SqStack st) { if (st.top == -1) {return 1;}else {return 0;}
}
进栈代码
int push(SqStack &st, int x) {if (st.top == maxSize - 1) { //栈不满return 0; }++(st.top);st.data[st.top] = x;return 1;
}
出栈代码
int pop(SqStack &st, int &x) {if (st.top == -1) { // 判断栈是否为空,return 0;}x = st.data[st.top];--(st.top);return 1;
}
链栈的初始化
void initStack(LNode*&lst) { //因为lst(头,申请)要改变LNode* lst = new LNode; //其实具体情况要看原本的lst有没有空间,此处为已经没有空间(或已经释放掉)情况下的操作lst->next = NULL;
}
判断栈空
int isEmpty(LNode *lst) {if (lst->next == NULL) {return 1;}else {return 0;}
}
进栈
void push(LNode *lst, int x) {LNode *p = new LNode; //定义p并指向 申请LNode类型节点的地址p->next = NULL;/*下面就是链表的头插法*/p->data = x;p->next = lst->next;lst->next = p;
}
出栈代码
int pop(LNode *lst, int &x) { //x的值需要改变 &LNode *p;if (lst->next == NULL) { //判断是否队空return 0;}/*下面就是单链表的删除操作*/p = lst->next;x = p->data;lst->next = p->next;delete p;return 1;
}
顺序栈的应用 (括号匹配)
int match(char exp[], int n) {char stack[maxSize]; //初始化int top = -1;for (int i = 1; i < n; ++i) {if (exp[i] == '(') {stack[++top] = '('; //先加再用}if (exp[i] == ')') {if (top == -1) //栈空return 0; //返回不匹配else--top; //出栈}}if (top == -1) //栈空(所有括号都匹配掉) return 1; //匹配elsereturn 0;
}
编写一个函数,求后缀式的数值,其后缀式存储于exp字符数组中,exp中最后一个字符为‘\0’作为结束符,假设后缀式中的数字都只有一位,出现的除法运算,都为整除运算,
int op(int a, char Op, int b) { //运算函数 完成 a Op b 的运算if (Op == '+')return a + b;if (Op == '-')return a - b;if (Op == '*')return a * b;if (Op == '/') {if (b == 0) { //被除数不能为0return 0; }else {return a / b;}}
}
int com(char exp[]) {int a, b, c; int stack[maxSize]; //注意此处是int型int top = -1;char Op; //取运算符for (int i = 0; exp[i] != '\0'; ++i) {if (exp[i] >= '0'&&exp[i] <= '9') { //如果是数字则入栈stack[++top] = exp[i] - '0'; //char向int 转化}else { //如果是运算符Op = exp[i];b = stack[top--]; //出栈a = stack[top--];c = op(a, Op, b); //运算stack[++top] = c;//进栈}}return stack[top];
}
用不带头结点的单链表储存链栈,设计初始化栈,判断栈是否为空,进栈和出栈相应操作
void initStack1(LNode *&lst) {//初始化lst = NULL;
}
int isEmpty1(LNode *lst) { //判断栈是否为空if (lst == NULL) {return 1;}else {return 0;}
}
void push1(LNode *&lst, int x) { //进栈LNode *p = new LNode;p->next = NULL;p->data = x;/*插入操作*/p->next = lst;lst = p;
}
int pop1(LNode *&lst, int &x) {LNode *p;if (lst == NULL) {return 0;}p = lst;/*删除节点操作*/x = p->data;lst = p->next;delete p;return 1;
}
共享栈 栈S0,S1公用一个存储区,设计共享栈相关入栈,出栈,操作的算法
typedef struct SqStack1 { //共享栈结构定义int elem[maxSize]; //栈空间int top[2]; //两个栈顶标志
};
int push(SqStack1 &st, int stNo, int x) { //入栈操作;stNo 是栈的编号,指示元素x在哪入栈if (st.top[0] + 1 < st.top[1]) { //栈不满if (stNo == 0) {++(st.top[0]);st.elem[st.top[0]] = x;return 1;}else if (stNo == 1) {--(st.top[1]);st.elem[st.top[1]] = x;return 1;}else {return 0; //编号错误 }}else {return 0; //共享栈满}
}
int pop(SqStack1 &st, int stNo, int &x) { //出栈操作if (stNo == 0) {if (st.top[0] != -1) { //判空x = st.elem[st.top[0]];--(st.top[0]);return 1;}else {return 0;}}else if (stNo == 1) {if (st.top[1] != maxSize) {x = st.elem[st.top[1]];++(st.top[1]);return 1;}else {return 0;}}else {return -1;}
}
用两个栈s1和s2来模拟一个队列,栈中元素为int型,栈中元素最多为manSize,已知三个定义如下
posh(ST, x); 元素x入栈
pop(ST,&x); 元素x出栈
isEmpty(ST); 判断ST栈是否为空。
如何利用栈的运算实现该队列的3个运算,enQueue(元素入队),deQueue(元素出队列),isQueueEmpty(判断队列是否为空,空返回1);
int enQueue(SqStack &s1, SqStack &s2, int x) { //入栈int y;if (s1.top == maxSize - 1) {if (!isEmpty(s2)) { //s1满,s2非空,这时s1不能再入栈return 0; }else if (isEmpty(s2)) { //若s2为空,则将s1退栈,在入栈while (!isEmpty(s1)) {pop(s1, y);push(s2, y);}push(s1, x);//x入栈return 1;}}else {push(s1, x); //s1不满,x直接入栈return 1;}
}
int deQueue(SqStack &s2, SqStack &s1, int &x) { //出栈int y;if (!isEmpty(s2)) { //栈s2不空,直接出队,返回1pop(s2, x);return 1;}else {if (isEmpty(s1)) {return 0;}else {while (!isEmpty(s1)) {pop(s1, y);push(s2, y);}pop(s2, x); //s2出栈,实现出队列return 1;}}
}
int isQueueEmpty(SqStack s1, SqStack s2) { //判断队是否为空if (isEmpty(s1) && isEmpty(s2)) {return 1;}else {return 0;}
}
写一个算法 判断入栈和出栈序列是否合法
int juge(char ch[]) {int i = 0, I = 0, O = 0; //I:入栈总次数, O出栈总次数while (ch[i] != '\0') {if (ch[i] == 'I') {I++;}if (ch[i] == 'O') {O++;}if (O > I) {return 0; //出栈次数大于入栈次数时}++i;}if (I != 0) {return 0;}else {return 1;}
}
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾节点,但不设头指针,请写出相应的入对和出队算法
void enQueue(LNode *&rear, int x) { //入队算法LNode *s = new LNode;s->data = x;s->next = rear->next;rear->next = s;rear = s;
}
int deQueue(LNode *&rear, int &x) { //出队算法LNode *s;if (rear->next == rear) {return 0;}else {s = rear->next->next; //s指向开始节点rear->next->next = s->next;x = s->data;if (s == rear) { //如果出栈后为空rear = rear->next;//指向头节点}delete s;return 0;}
}
设计一个算法,将一个非负十进制整数N转换为一个二进制数
int BaseTrans(int N) {int i, result = 0;int stack[maxSize], top = -1;while (N != 0) {i = N % 2;N = N / 2;stack[++top] = i;}while (top != -1) {i = stack[top];--top;result = result * 10 + i;}return result;
}
天勤数据结构代码——栈基本操作相关推荐
- 天勤数据结构代码——链表基本操作
结构定义 typedef struct LNode {int data; // 数据域(可以是其他类型)struct LNode *next;//指针域 (此处代表指向后驱节点) }; A和B是两个单 ...
- c语言栈的实现以及操作_数据结构之链栈基本操作的实现详解(C语言描述)
迎新过后,来带领你好好学习的小软准时归来,快带着上次学习链表操作的记忆和我开启新的旅程吧: 链栈:就是栈的链式存储结构,简称链栈. 首先我们要考虑的就是链栈的存储结构,由于栈只是在栈顶进行插入和删除操 ...
- 天勤数据结构-代码题2
已知一个带有表头节点的单链表,节点结构为:{data,next},假设该链表只给出了头指针head,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点.查找成功返回该结 ...
- c++怎么实现数字数组的删除数字_C/C++数据结构:栈结构解析,最简单解析,让你一遍就会...
上一章节针对于C语言最基本的数据结构链式结构体做了解析,不清楚的可以回顾一下.本章节主要针对于C语言的基础数据结构栈做以解析. 数据结构之栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅 ...
- 搬砖:数据结构之链表基本操作总结
数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...
- C语言【数据结构】栈和队列【OJ题(C++)、选择题】
目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...
- 王道考研数据结构代码总结(前四章)
目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...
- 全网最全 数据结构 代码
原文 本文代码实现基本按照<数据结构>课本目录顺序,外加大量的复杂算法实现,一篇文章足够.能换你一个收藏了吧? 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标 ...
- 10.数据结构:栈和队列
大家好,我王有志又回来啦.关注王有志,回复DSA获取数据结构和算法学习资源. 最近被全链路优化搞得焦头烂额,等抽出时间来和大家分享下我司正在做的"全面提速工程". 今天我们来学习线 ...
最新文章
- 基础总结篇之一:Activity生命周期
- unity开宝箱动画_unity简单动画实现
- Ubuntu16.04LTS Install Intel® RealSense™ ROS from Sources
- 超低内阻mos管_FHU100N03低压MOS管保障榨汁机电路正常运行!
- GDIPlus灰度化图像
- Spring Setter依赖注入示例
- 注意:匿名函数调用直接加载函数名setInterval(move,30)
- 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网
- python的动态参数
- 虚拟化时代 智能数据管理架构才是王道
- LoadRunner学习笔记
- zgc,JDK8有类似的shenandoah,华为移植到JDK11
- Ubuntu9.10下永中Office2009安装
- uniapp 运行到手机或模拟器
- pe服务器注册表,注册表修复方法
- 移动硬盘电脑计算机无显示,移动硬盘插上去不显示怎么办_电脑插移动硬盘无反应怎么解决...
- osg qt 三维模型加载
- 熟悉VBA的编程环境---VBE
- 枯燥的Kotlin协程三部曲(上)——概念启蒙篇
- 从RC低通滤波到卷积的理解