首页 > 其他分享 >C 栈模板及笔记

C 栈模板及笔记

时间:2023-03-20 16:31:41浏览次数:36  
标签:Status return sqStack top Elem 笔记 base 模板


文章目录

  • ​​Intro​​
  • ​​1. 熟练掌握栈的定义、特性和栈的抽象数据类型,​​
  • ​​定义​​
  • ​​是 限定 仅在队尾 进行插入或删除操作的 先行比爱​​
  • ​​特性​​
  • ​​表尾端 栈顶 top​​
  • ​​后进先出 原则​​
  • ​​抽象数据类型​​
  • ​​P57​​
  • ​​2. 栈与递归的关系​​
  • ​​递归​​
  • ​​定义是递归的​​
  • ​​存在一个函数 过程 数据结构 定义的内部 直接或者间接 出现定义本身的应用, 则称为递归的​​
  • ​​阶乘 分治法​​
  • ​​数据结构是递归的​​
  • ​​LNode 结点 由 data next 组成,而next本身是一种指向LNode 的指针 即LNode定义中调用了自身, 所以连表示一种递归的数据结构​​
  • ​​链表 二叉树​​
  • ​​问题的解法是递归的​​
  • ​​问题本身没有明显的递归结构,但是递归求解比迭代求解更加简单​​
  • ​​Hanoi 八皇后 迷宫​​
  • ​​关系​​
  • ​​函数执行中,需要多次自我调用​​
  • ​​调用函数和被调用函数之间的连接及信息交换需要通过栈来进行​​
  • ​​多个函数嵌套调用时,按找“先调用后返回”的原则,函数之间的信息传递和控制转移必须由 栈 来进行,及系统将整个程序运行时所需要的数据空间安排在一个栈当中,没调用一个函数就在站定分配一个储存区,当一个函数退出时,就是放它的储存区,则当前执行的函数的数据必然在栈顶​​
  • ​​顺序栈​​
  • ​​链表栈​​
  • ​​进制转换​​
  • ​​括号匹配​​
  • ​​DevLog​​

Intro

1. 熟练掌握栈的定义、特性和栈的抽象数据类型,

定义

是 限定 仅在队尾 进行插入或删除操作的 先行比爱

特性

表尾端 栈顶 top

后进先出 原则

抽象数据类型

P57

2. 栈与递归的关系

递归

定义是递归的

存在一个函数 过程 数据结构 定义的内部 直接或者间接 出现定义本身的应用, 则称为递归的
阶乘 分治法

数据结构是递归的

LNode 结点 由 data next 组成,而next本身是一种指向LNode 的指针 即LNode定义中调用了自身, 所以连表示一种递归的数据结构
链表 二叉树

问题的解法是递归的

问题本身没有明显的递归结构,但是递归求解比迭代求解更加简单
Hanoi 八皇后 迷宫

关系

函数执行中,需要多次自我调用

调用函数和被调用函数之间的连接及信息交换需要通过栈来进行

多个函数嵌套调用时,按找“先调用后返回”的原则,函数之间的信息传递和控制转移必须由 栈 来进行,及系统将整个程序运行时所需要的数据空间安排在一个栈当中,没调用一个函数就在站定分配一个储存区,当一个函数退出时,就是放它的储存区,则当前执行的函数的数据必然在栈顶

顺序栈

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 100

typedef int Status;
typedef int Elem;

typedef struct sqStack
{
int len;
Elem *base;
Elem *top;
}sqStack;

Status InitStack(sqStack &s)
{
s.base = new Elem[MAXSIZE];
if (!s.base) return 0;

s.top = s.base;
s.len = MAXSIZE;

return 1;
}

Status Push(sqStack &s,Elem e)
{
if (s.top - s.base == s.len) return 0; //满
else *s.top++ = e;

return 1;
}

Status Pop(sqStack &s, Elem &e)
{
if (s.top == s.base) return 0; //空
else e = *--s.top;

return 1;
}

Status GetTop(sqStack &s)
{
if (s.top != s.base)
return *(s.top - 1); //满意的写法 *了

else return 0;
}

int main()
{
sqStack s;
//1
InitStack(s);

//1
Push(s,1);

//1
cout << GetTop(s);

//1
Elem e;
Pop(s, e);

cout << e;
}

链表栈

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 100

typedef int Status;
typedef int Elem;

typedef struct sqStack
{
int len;
Elem *base;
Elem *top;
}sqStack;

Status InitStack(sqStack &s)
{
s.base = new Elem[MAXSIZE];
if (!s.base) return 0;

s.top = s.base;
s.len = MAXSIZE;

return 1;
}

Status Push(sqStack &s,Elem e)
{
if (s.top - s.base == s.len) return 0; //满
else *s.top++ = e;

return 1;
}

Status Pop(sqStack &s, Elem &e)
{
if (s.top == s.base) return 0; //空
else e = *--s.top;

return 1;
}

Status GetTop(sqStack &s)
{
if (s.top != s.base)
return *(s.top - 1); //满意的写法 *了

else return 0;
}

int main()
{
sqStack s;
//1
InitStack(s);

//1
Push(s,1);

//1
cout << GetTop(s);

//1
Elem e;
Pop(s, e);

cout << e;
}

进制转换

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 100

typedef int Status;
typedef int Elem;

typedef struct sqStack
{
int len;
Elem *base;
Elem *top;
}sqStack;

Status InitStack(sqStack &s)
{
s.base = new Elem[MAXSIZE];
if (!s.base) return -1;

s.top = s.base;
s.len = MAXSIZE;

return 1;
}

Status Push(sqStack &s, Elem e)
{
if (s.top - s.base == s.len) return -1;
else *s.top++ = e;

return 1;
}

Status Pop(sqStack &s, Elem &e)
{
if (s.top == s.base) return -1;
else e = *--s.top;

return 1;
}

Status GetTop(sqStack &s)
{
if (s.top != s.base)
return *(s.top - 1);

else return -1;
}

Status StackEmpty(sqStack &s)
{
if (s.top == s.base)
return 1;

else return 0;
}

Status conversion(sqStack &s, int n, int key) //书上代码根本不对劲 你不觉得吗? 改了一下
{
InitStack(s);

while (n)
{
Push(s, (n%key));
n /= key;
}

while (!(StackEmpty(s)))// StackEmpty 没有这个代码 自己补充 其实也很好想
{
Elem e;
Pop(s, e);
cout << e;
}

return 1;
}

int main()
{
sqStack s;

conversion(s, 10, 2);
}

括号匹配

#include <iostream>
#include <cstdio>
using namespace std;

#define MAXSIZE 100

typedef int Status;
typedef char Elem;

typedef struct sqStack
{
int len;
Elem *base;
Elem *top;
}sqStack;

Status InitStack(sqStack &s)
{
s.base = new Elem[MAXSIZE];
if (!s.base) return -1;

s.top = s.base;
s.len = MAXSIZE;

return 1;
}

Status Push(sqStack &s, Elem e)
{
if (s.top - s.base == s.len) return -1;
else *s.top++ = e;

return 1;
}

Status Pop(sqStack &s, Elem &e)
{
if (s.top == s.base) return -1;
else e = *--s.top;

return 1;
}

Elem GetTop(sqStack &s)
{
if (s.top != s.base)
return *(s.top - 1);

else return -1;
}

Status StackEmpty(sqStack &s)
{
if (s.top == s.base) //什么叫真正的简洁.....
return 1;

else return 0;
}

Status Marchting(sqStack &s)
{
InitStack(s);
int flag = 1;
char ch;
cin >> ch;
while (ch != '#' && flag) //!= # 的话 直接拿‘#’ 作为终止符了
{
char tmp;
switch (ch)
{
case '[':
case '(':
Push(s, ch);
break;
case ')':
if (!StackEmpty(s) && GetTop(s) == '(')
Pop(s, tmp);
else flag = 0; //如果前一个不匹配 就没必要执行了 必然不是嘛
break;
case ']':
if (!StackEmpty(s) && GetTop(s) == '[')
Pop(s, tmp);
else flag = 0;
break;;
}
cin >> ch;
}
if (StackEmpty(s) && flag)
return 1;

else return 0;
}
int main()
{
sqStack s;

//[]# [()]# [)#
cout << Marchting(s);
}

DevLog



sqStack 中 感觉很顺利
不得不说 我他妈逐渐原谅了 书上的代码
仔细看看(并不是很仔细) 也挺有道理的

&s 直接改变本身 这个还是想提一下
&e 直接返回给自己

Elem *base; Elem *top; 两个指针的用法与好处还是非常明显 毕竟我之前用顺序栈的时候都是直接刚过去… 那想过这个

*s.top++ = e; 这种简写方式 初看也是有点蛋疼的 真牛皮啊 不得不想起 >>1 这种蛋疼操作



进制转换部分

在输出结果部分一直出错 一支无输出结果
神奇
排查之后 发现是 while (!(StackEmpty(s))) 返回结果
-1 取反 为0
真实
太真实了

Status StackEmpty 空时 返回值改为 return 0 就OK

就这都坑了我半小时?…

另外 书上的 Status conversion(int N) 感觉不全
改为

Status conversion(sqStack &s, int n, int key)
{
InitStack(s);

while (n)
{
Push(s, (n%key));
n /= key;
}

while (!(StackEmpty(s)))
{
Elem e;
Pop(s, e);
cout << e;
}

return 1;
}

书上 无 StackEmpty(s) 添加为

Status StackEmpty(sqStack &s)
{
if (s.top == s.base)
return 1;

else return 0;
}

3.括号匹配
这个题 好理解 是真的好理解
看输入 选择 加flag 关门
但是我犯了几个小错误 不得不提

3.1 视频代码 的 ‘(’||‘[’是错误的!

3.2 真的要加break 不然我 pop 连续两下 人都傻了

3.3 原本我是 Status GetTop 这里有问题 返回值 所以我改成了 Elem GetTop 啊 以前感觉是装逼用的 elem 现在察觉真好用啊 大家一次解决



理解是理解啊 看着是真麻烦


标签:Status,return,sqStack,top,Elem,笔记,base,模板
From: https://blog.51cto.com/u_16014765/6133200

相关文章

  • Fortran读书笔记(3)
    本篇文章为本人读气象出版社的fortran程序设计,若有侵权,请私信,本人立即删除数组的定义数组举例:integera(-5,5),b(20)character*8d(50)dimensiona(2,3)integera......
  • 《深入理解计算机系统》第四章学习笔记 处理器体系结构
    一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。不同的处理器“家族”,例如IntelIA32和x86-64、IBM/FreescalePower和ARM处理器家族,都有不同的ISA。一个......
  • TypeScript 学习笔记 — 类型兼容 (十)
    目录一.基本数据类型的兼容性二.接口兼容性三.函数的兼容性四.类的兼容性类的私有成员和受保护成员五.泛型的兼容性六.枚举的兼容性标称类型简短介绍TS是结构类型系统(str......
  • C 链表模板及笔记
    文章目录​​Intro​​​​理解线性表的基本概念(逻辑特性、术语及物理存储)​​​​基本概念​​​​n(n>=0)个数据特性相同的元素构成的有限序列称为线性表​​​​逻辑特......
  • [模板题]数的范围
    来源:模板题,AcWing算法标签二分题目描述给定一个按照升序排列的长度为n的整数数组,以及q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果......
  • java 根据word xml模板生成word(个人v2版本)
    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说1,编辑word并保存为xml其中需要动态输出的内容使用${xxx}代替,xxx是你的java类属性值,如:年龄:${age......
  • Asp.Net MVC学习笔记2
       Areas区域。随着项目的不断扩大,Controllers控制器也在不断变多,这样即时使用文件夹分隔也不易于项目维护,和阅读。Asp.NetMVC提供了Areas的功能可以把项目中的没一......
  • 论文阅读笔记《Is Mapping Necessary for Realistic PointGoal Navigation?》
    IsMappingNecessaryforRealisticPointGoalNavigation?现实点目标导航是否需要地图?CVPR2022PartseyR,WijmansE,YokoyamaN,etal.IsMappingNecessaryf......
  • 使用工厂模式+策略模式+模板方法实现对大量if...else的改造
    1.策略模式+工厂模式+模板模式实际开发工程中,一些业务很复杂的逻辑使用很多的if或者if···else语句,不利于维护和扩展,为了使代码更加优雅,利于维护可以采用策略模式+......
  • 人月神话阅读笔记其二————“焦油坑”与“外科手术队伍”
         上次我们谈论到了人月神话,而焦油坑是作者提到的另一个有趣的概念,它是用来形容大型系统开发的。远古时期的恐龙、猛犸象这些大型食肉动物碰到焦油坑也是没有......