顺序栈

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;
}

天勤数据结构代码——栈基本操作相关推荐

  1. 天勤数据结构代码——链表基本操作

    结构定义 typedef struct LNode {int data; // 数据域(可以是其他类型)struct LNode *next;//指针域 (此处代表指向后驱节点) }; A和B是两个单 ...

  2. c语言栈的实现以及操作_数据结构之链栈基本操作的实现详解(C语言描述)

    迎新过后,来带领你好好学习的小软准时归来,快带着上次学习链表操作的记忆和我开启新的旅程吧: 链栈:就是栈的链式存储结构,简称链栈. 首先我们要考虑的就是链栈的存储结构,由于栈只是在栈顶进行插入和删除操 ...

  3. 天勤数据结构-代码题2

    已知一个带有表头节点的单链表,节点结构为:{data,next},假设该链表只给出了头指针head,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点.查找成功返回该结 ...

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

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

  5. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

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

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

  7. 王道考研数据结构代码总结(前四章)

    目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...

  8. 全网最全 数据结构 代码

    原文 本文代码实现基本按照<数据结构>课本目录顺序,外加大量的复杂算法实现,一篇文章足够.能换你一个收藏了吧? 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标 ...

  9. 10.数据结构:栈和队列

    大家好,我王有志又回来啦.关注王有志,回复DSA获取数据结构和算法学习资源. 最近被全链路优化搞得焦头烂额,等抽出时间来和大家分享下我司正在做的"全面提速工程". 今天我们来学习线 ...

最新文章

  1. 基础总结篇之一:Activity生命周期
  2. unity开宝箱动画_unity简单动画实现
  3. Ubuntu16.04LTS Install Intel® RealSense™ ROS from Sources
  4. 超低内阻mos管_FHU100N03低压MOS管保障榨汁机电路正常运行!
  5. GDIPlus灰度化图像
  6. Spring Setter依赖注入示例
  7. 注意:匿名函数调用直接加载函数名setInterval(move,30)
  8. 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网
  9. python的动态参数
  10. 虚拟化时代 智能数据管理架构才是王道
  11. LoadRunner学习笔记
  12. zgc,JDK8有类似的shenandoah,华为移植到JDK11
  13. Ubuntu9.10下永中Office2009安装
  14. uniapp 运行到手机或模拟器
  15. pe服务器注册表,注册表修复方法
  16. 移动硬盘电脑计算机无显示,移动硬盘插上去不显示怎么办_电脑插移动硬盘无反应怎么解决...
  17. osg qt 三维模型加载
  18. 熟悉VBA的编程环境---VBE
  19. 枯燥的Kotlin协程三部曲(上)——概念启蒙篇
  20. 从RC低通滤波到卷积的理解

热门文章

  1. 关于带参数模糊查询的方法 like --转载自 寂寞沙洲(博客园)
  2. 字符串长度的计算与字符串比较
  3. Unity编辑器知识
  4. 名企到访|南京汇智动力共建教学资源,推进校企项目IT人才实训!
  5. Python源码剖析2-字符串对象PyStringObject
  6. 北东地坐标系转换c语言,北东地/东北天两种导航坐标系与姿态转换
  7. [Python] Basemap入坑手册 - 地图投影示例
  8. 正点原子stm32F407学习笔记3——蜂鸣器实验
  9. 当你PMP证书到期后,续证的方法有哪些?
  10. 你应该知道的 纳什均衡,并且用 python 实现