栈 & 队列 & 优先队列 & map & set & vector

栈和队列相似但是不同,不同的是队列先进先出从末尾进排头出,栈像一个瓶子容器,从瓶口进,瓶口出,先进的在瓶底所以后出,所以栈的特点 先进后出,后进先出。然后下面讲用法和例题。

#include<stack>
stack<char(可以是int等)> q(名字);
q.push(a);     //将a入栈
q.pop();       //将栈顶出栈
q.top();       //栈顶的值
q.empty();     //判断是否为空

例题:假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

输入输出格式
输入格式:
一行:表达式

输出格式:
一行:“YES” 或“NO”

输入输出样例

输入样例#1:
2*(x+y)/(1-x)@
输出样例#1:
YES

输入样例#2:
(25+x)(a(a+b+b)@
输出样例#2:
NO

题解:将所有左括号挨着入栈,然后每次出现右括号就去判断栈里面是否有左括号,如果有就继续,没有说明不合理就NO

代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    #define exp 1e-9
    #define PI acos(-1.0)
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef unsigned long long LL;
    stack<char> zhan;
    int main() 
    {
        char input;
        while(scanf("%c",&input)&&input!='@') 
        {
            if(input=='(') 
               zhan.push(input);//入栈 
            if(input==')') {
                if(zhan.empty()) //判断栈是否为空即可 
                {
                    printf("NO\n");//也许大家会问,为啥不来个if(zhan.top()=='(' )呢,因为 这题只有小括号 而且会超时
                    return 0;//至于为啥要判断栈是否为空,大家想想,因为假如有个),结果前面没有对应(了,那就不行,此时就是栈空 
                }
                zhan.pop();//出栈 
            }
        }
        if(zhan.empty())
            printf("YES\n");//判断有没有多余的(
        else 
            printf("NO\n");//也就是判断栈是否为空 
        return 0;
    }

队列

队列就是一行人排在一起,先进去的人排在第一个,后进去的人排在后面,所以队列的特点先进先出,这个是很重要的。在处理一些特殊问题的时候,队列是非常有用的。下面主要讲用法和例题。

  #include<queue>   //要包含头文件
  int a,b,c;  
  queue<int> q1;       //定义q1 队列  <>中的为数据类型
  q1.push(3);   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. C++ STL(Standard Template Library)是C++标准库的一部分,提供了丰富的模板类和函数,用于简化常见的编程任务。STL的设计目标是提供高效、可重用和通用的数据结构和算法。它包括容器、算法和迭代器三个主要组件。 2. 适配器队列的内部实现及使用: - 适配器(stack)是一种后进先出(LIFO)的数据结构。它基于双端队列(deque)实现,可以使用 push、pop 和 top 等操作进行元素的入、出和访问操作。 - 适配器队列(queue)是一种先进先出(FIFO)的数据结构。它也基于双端队列(deque)实现,可以使用 push、pop 和 front 等操作进行元素的入队、出队和访问操作。 3. 字符串容器 string 的实现及使用: - 字符串容器 string 是基于动态数组实现的,提供了一系列对字符串进行操作的成员函数,如插入、删除、查找、替换等。它还支持重载的运算符,使得字符串可以像基本类型一样进行操作。 4. 容器 vector 和 list 的使用及区别: - vector 是一个动态数组,支持随机访问,插入和删除元素的开销较大,适用于需要频繁访问元素的场景。 - list 是一个双向链表,不支持随机访问,插入和删除元素的开销较小,适用于需要频繁插入和删除元素的场景。 5. 关联容器 setmap 的内部实现及使用和区别: - set 是一个有序的容器,其中的元素是唯一的,内部实现通常是红黑树。 - map 是一个有序的键值对容器,其中的键是唯一的,内部实现通常也是红黑树。map 中的每个元素都是一个键值对,可以通过键来访问对应的值。 6. 迭代器是 STL 中的一个重要概念,用于遍历容器中的元素。它提供了一种统一的访问方式,使得算法可以独立于容器进行操作。 7. STL 内置算法函数(如 sort、find 等)是为了方便对容器进行常见操作而提供的函数。sort 用于对容器中的元素进行排序,find 用于在容器中查找指定元素。 8. C++11 的 auto 和 nullptr 是 C++11 新增的特性。auto 可以自动推导变量类型,nullptr 是空指针常量。它们可以简化代码并提高代码的可读性和可维护性。 9. C++11 的 for 范围遍历是一种更加简洁的遍历容器的方式,可以自动遍历容器中的每个元素,无需显式使用迭代器。 10. C++11 的 Lambda 表达式是一种匿名的函数对象,可以在需要函数对象的地方使用,提供了一种方便的语法来定义和使用函数对象。 11. C++11 的智能指针、右值引用和多线程是为了提供更好的内存管理和并发编程支持。智能指针用于自动管理动态分配的内存,右值引用支持移动语义和完美转发,多线程支持并发执行任务。 12. 多线程同步方式包括互斥锁、条件变量、原子操作等,用于保证多个线程之间的正确操作和协调。互斥锁用于保护共享资源,条件变量用于线程间的通信,原子操作用于保证多线程下的原子性操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值