(三十二)栈(stack)


这篇文章将会讲两个不同的数据类型,分别是栈与队列(双向队列是两个的拓展)

栈(stack)

栈是一种特殊的数据类型,它遵守先进后出(FILO, First In Last Out)规则。

1.1 操作

这是栈的图片

想要使用栈,我们可以导入头文件#include <stack>

随后使用stack<Typ> T; 的格式来定义一个类型为Typ的栈:T

栈有这些函数

  1. T.push(x):在T的栈顶插入一个元素x
  2. T.pop():删除T的栈顶
  3. T.top():返回T的栈顶
  4. T.size():返回T的大小
  5. 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()

预览 发生了变更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值