栈
理解为弹匣比较形象。一个口,出入都用,先进后出,用完扔掉,下一个补上。
建议:数组+1个栈顶指针。
STL库里已经提供了一些成型的结构,包括栈和队列。这里先写一点定义和常用函数。
不过纯粹的c不行,得有个using namespace std; std也可以用啥打啥,不过一句话解决真的省事……
搜了下网上的STL源码,看不懂……orz
每个函数自己随手写了一下,但是没用链式没那么优化,存储空间上就比不上…orz
不过方便是真方便,做简单题偷个闲什么的……
STL的栈可以用各种类型定义,包括自定义的结构体类型。
STL栈源代码
头文件
#include<stack>
自己写就不调用库函数了
定义
stack<变量类型>变量名;
stack<int>zhan;
对,不用中括号搞容量
变量类型 变量名[容量];
int zhan[101];
配套一个栈顶指针,命名也可以跟栈的名字有关,方便区分,提高可读性
例:int zhan_point;
int一个常规变量直接当下标也行,用相应变量类型放一个真的指针也行。不用链式,个人习惯前一种,因为比较菜,对指针理解不深……
一般用的话,用简单的栈就行,结构体栈(非链式)……感觉其实可以多个数组栈共用同一个栈指针(这样就只能用下标式指针)。
函数
使用时当然要区分不同栈的操作,所以在前面加 栈名. 来区分
例:zhan.pop();
有时候操作的语句比较短,某些功能都没单独提出来当函数,可能对可读性有点影响
empty()
栈空返回1,否则返回0
看指针位置就行,如果直接就是int型的下标指针,只要看等不等于初始位置(0或1)
zhan_point==0?1:0
pop()
弹栈,移除栈顶元素
point–;直接调栈顶指针
但是空间上面难免浪费,链式操作应该会好一些
push(进栈的量)
压栈,栈顶添加元素
问题:scanf或者cin不会直接读进去…orz
只会临时放一个中转变量……
问题:auto定义和每次新int中转变量有什么区别
zhan[zhan_point++]=进栈的量;
先用后加或者先加后用都行,根据实际需求调整
size()
返回栈的元素数
根据指针的起始位置和压栈操作指针的方式,就是zhan_point或者zhan_point-1之类
top()或者gettop()
目前找到的STL用的top()
功能上是返回栈顶元素,但是保留它,不动指针
根据压栈操作指针的方式,就是zhan[zhan_point-1]或者zhan[zhan_point]
队列
暂时当成隧道吧……没想到好的例子。
两个口,一入一出,先进先出,出了就不管了。
建议:数组+2个指针(头尾各1个)
其他方面跟栈的差不多,就不再重复闲话了……
头文件
#include<queue>
定义
queue<变量类型>变量名;
queue<int>duilie;
变量类型 变量名[容量];
数组加头尾指针
函数
empty()
队空返回1,否则返回0
非链式的话,队列就不像栈一样,栈底位置固定,队列的头尾都在跑(贪吃蛇?)所以检查方式是top?=end
top==end?1:0
pop()
出队,移除队顶元素(虽然自己写的伪指针的值小于另一个指针的值)
(这个模拟相当于把队列当做可移动栈底的栈)
end++;
push(进队的量)
进队,元素放入队尾
duilie[top++]=进队的量;
size()
返回队列元素的数量
top-end+1
front()
返回队顶元素
duilie[top]
back()
返回队尾元素
duilie[end]
实际使用时,根据进出队列时指针的操作方式,top和end可能要+or- 1
栈的应用
做题时数据的输入方式在一定程度上影响了算法。
匹配括号
感觉这个东西可以不用栈,读整个字符串,直接用数值当下标的伪指针模拟栈操作就好。(感觉偷懒了)
3种括号配3种对应指针(if分别找到归属),左括号+1,右括号-1。指针出负数就直接false并return,最后看3个伪指针数值之和是不是0就可以了。
空字符串单独处理即可。
负数方面就是经验教训了:)( 最后结果是0,但却是不匹配的,当时莽了没看第二个要求……
逆波兰表达式(后缀表达式)
从此程序出发,可以完成前缀和正序表达式的计算。正序的括号处理要特别注意。
当初做的题是读一整个字符串,虽然开始处理不是很容易,但是功能拓展(小数,分数,百分数,幂)(其实就是多几个判断)比较方便。
leetcode数字字符分开输入的方式一定程度上简化了这个处理过程,只需要判断类型并读取就好,感觉还是习惯用strlen,但是数字从字符形式取出还需要单独跑函数。
数字直接用栈存储,计算就是读到符号就拿元素出来算,中间结果再压栈,最后栈顶就是答案。计算也能先把符号全部读取进栈再处理,不过感觉没必要……
看了下其他大佬的代码,atoi字符转整数感觉挺友好,vector……口碑很好但是至今没有好好学……
PLUS:还是觉得自己读数据存储比较舒服……LeetCode还是不太习惯……
接雨水还没正经看……第一反应居然是模拟搜索……
570

被折叠的 条评论
为什么被折叠?



