文章目录
- 栈(stack)
- 1.1 操作
- 1.2 关于栈的题目
- 1.2.1 出栈顺序
- 1.2.2 入栈顺序
- 1.3.3 括号匹配
这篇文章将会讲两个不同的数据类型,分别是栈与队列(双向队列是两个的拓展)
栈(stack)
栈是一种特殊的数据类型,它遵守先进后出(FILO, First In Last Out)规则。
1.1 操作
这是栈的图片
想要使用栈,我们可以导入头文件#include <stack>
随后使用stack<Typ> T;
的格式来定义一个类型为Typ
的栈:T
栈有这些函数
T.push(x)
:在T
的栈顶插入一个元素x
T.pop()
:删除T
的栈顶T.top()
:返回T
的栈顶T.size()
:返回T
的大小T.empty()
:判断T
是否为空,是返回1,不是返回0(bool
类型)
1.2 关于栈的题目
1.2.1 出栈顺序
❗常见题型❗
例题: 有一个序列以
a
,
b
,
c
,
d
,
e
,
f
,
g
a,b,c,d,e,f,g
a,b,c,d,e,f,g 的顺序入栈,下列( )不是合法的出栈序列?(单选题)
- A. d , c , f , e , g , b , a d, c, f, e, g, b, a d,c,f,e,g,b,a
- B. g , f , e , d , c , b , a g, f, e, d, c, b, a g,f,e,d,c,b,a
- C. a , b , e , c , d , g , f a, b, e, c, d, g, f a,b,e,c,d,g,f
- D. a , b , c , d , e , f , g a, b, c, d, e, f, g a,b,c,d,e,f,g
A. a , b , c , d a, b, c, d a,b,c,d依次入栈,随后 d , c d, c d,c出栈,然后 e , f e, f e,f入栈后再倒序出栈,再让 g g g入栈,最后全部出栈
B. a , b , c , d , e , f , g a, b, c, d, e, f, g a,b,c,d,e,f,g全部入栈,随后全部出栈
C. a , b , c , d , e a, b, c, d, e a,b,c,d,e入栈, e e e出栈,随后 c c c出栈,但 c c c不是栈顶,因此不合法
D. a a a入栈, a a a出栈, b b b入栈, b b b出栈,…, g g g入栈, g g g出栈
1.2.2 入栈顺序
❗常见题型❗
例题: 有一个栈以
a
,
b
,
c
,
d
,
e
a, b, c, d, e
a,b,c,d,e 的顺序出栈,下列( )是合法的入栈序列?(多选题)
- A. a , e , c , d , b a, e, c, d, b a,e,c,d,b
- B. e , d , c , a , b e, d, c, a, b e,d,c,a,b
- C. a , d , c , e , b a, d, c, e, b a,d,c,e,b
- D. d , b , e , c , a d, b, e, c, a d,b,e,c,a
不用多说了吧,就是出栈顺序的逆向思维
要注意题目的关键字是与不是,就像考试一样
1.3.3 括号匹配
❗完善程序❗
输入一个由()[]四种符号构成的字符串。判断其中的括号是否匹配,是,就输出yes,否则输出no。
比如:输入“([])”、“([()])”、“[((()))]”、“()[][][]”这几个字符串(双引号内部的内容),我们都算是匹配的。
再比如:输入“([)”、“([)]”、“([(]))”这几个字符串,我们都认为是不匹配的
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
stack<char> T;
for(int i=0; i<s.size(); ++i) {
if(s[i]=='('||s[i]==①) {
T.push(②);
} else if(③) {
④
} else {
cout << "no";
return 0;
}
}
cout << (⑤?"yes":"no");
return 0;
}
(1) ①处应填( )
- A.
')'
- B.
'['
- C.
']'
- D.
'('
(2) ②处应填( )
- A.
'T.top()'
- B.
T[i]
- C.
s[i]
- D.
i
(3)③处应填( )
- A.
!T.empty()&&T.top()=='('&&s[i]==')'||!T.empty()&&T.top()=='['&&s[i]==']'
- B.
T.empty()&&T.top()=='('&&s[i]==')'||T.empty()&&T.top()=='['&&s[i]==']'
- C.
!T.empty()&&T.pop()=='('&&s[i]==')'||!T.empty()&&T.pop()=='['&&s[i]==']'
- D.
!T.empty()&&T.top()=='('&&T[i]==')'||!T.empty()&&T.top()=='['&&T[i]==']'
(4)④处应填 ( )
- A.
T.push(s[i])
- B.
T.pop()
- C.
T.push(T.top())
- D.
T.push(i)
(5)⑤处应填( )
- A.
!T.empty()
- B.
!s.size()
- C.
!s.empty()
- D.
!T.size()
预览 发生了变更
- 二十五:递归
- 二十六:vector容器
- 二十七:递推
- 二十八:set容器
- 二十九:map容器
- 三十:二分查找
- 三十一:前缀和与差分
- 三十二:栈(stack)
- 三十三:队列(queue)
- 三十四:常见算法汇总
- 三十五:链表
- 三十六:树
- 三十七:图
- 三十八:赛事的坑有多大
…