栈
这是啥?
栈是一种数据结构,遵循先入后出(FILO)原则。
具体来说,可以把栈想象成一堆书。
如果要把一本书放进书堆里,就要把这本书放在这堆书的最上面。
如果要拿出书堆中的一本书,就要从这堆书的最上面拿出这本书。
代码怎么写?
手写栈用数组模拟即可,这里不再过多介绍。
如果要使用 STL
栈,需要 #include<stack>
。stack
的用法:
stack<int> s
:定义一个存放int
的栈。当然int
也可以换成其他类型。s.push(a)
:将a
压入栈。s.pop()
:弹出栈顶。s.empty()
:如果栈为空返回1
,否则返回0
。s.size()
:返回栈当前的大小。s.emplace(a)
:同s.push(a)
,但理论上更快。(C++11)
如果 a,b
是两个栈,可以用 a.swap(b)
来交换两个栈,理论上比 swap(a,b)
快。
有什么用?
貌似只能判括号表达式了……但是实现很简单,只需要扫一遍表达式:
- 如果当前字符是左括号,则直接入栈。
- 如果当前字符是右括号,
1.栈为空:表达式不合法。
2.栈顶和这个右括号不匹配:表达式不合法。
3.栈顶和这个右括号匹配:弹出栈顶。
- 其他字符:忽略。
扫完一遍,如果栈为空,则表达式合法,否则不合法。
原理:栈是先入后出的,当前的栈顶必然是当前位置前面的第一个没有匹配的左括号,
如果现在的右括号和前面的第一个没有匹配的左括号能匹配,
就把这两个括号匹配,下一个右括号就要匹配上一个左括号。