1:基础概念:
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。
缺省的意思是只要不指定特定数据结构,那就是队列指定生成栈。
(T232)用栈实现队列
首先了解队列有四种用法:
入队,出队,返回对头元素,删除队头元素。
对于入队:就是将元素插入队尾,也就相当于将元素直接插入到栈底,
从队列开头移除并返回元素:由于队列是先入先出,所以按照这个逻辑,对于栈也必须是先入先出,但是一个栈是先入后出的,所以需要使用两个栈,将其中一个栈的栈顶元素插入另一个元素的栈底,这样的话,栈底元素自然而然的成为栈顶元素,同样,满足条件就是当出栈为空的时候,就一股脑的将入栈元素全部插入栈元素,最后定义一个输出result.并且指向出栈的栈顶,将栈顶元素弹出之后,接收元素,随后返回。
返回队列开头元素,归根结底就是将出栈弹出的元素再次加入到出栈元素中,然后返回就行,判断队列是否为空,只需要考虑入栈,出栈是否为空即可。
(T225)用队列实现栈
同理,按照上述方法,实现用队列实现栈的解法,定义两个队列,
对于第一个要求:将元素x压入栈顶,就是将元素压入到队列1中
第二个要求:移除并返回栈顶元素:
(T1047)删除字符串中的所有相邻重复项
定义一个栈,一个字符串,类似消消乐一样,只要字符串中的数字不等于栈顶元素,那么就压栈,反之等于栈顶元素,那么就将栈顶元素删除,结束之后,再将所有元素直接加入到result之中,最后reverse反转。
(T150) 逆波兰表达式求值
循环遍历字符串中的所有的元素,依次入栈,但凡遇到加减乘除,便可依次进行运算,运算结束之后再反转一下字符串即可,最后,返回result。注意:stoi函数是将字符串中的数字转换为十进制数入栈后进行运算。