搜索
热搜: NOIP OIer 神牛
查看: 361|回复: 2

STL容器:栈 1350 表达式括号匹配题解

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-28 13:02:27 | 显示全部楼层 |阅读模式
本帖最后由 yuanbao 于 2023-3-28 22:23 编辑

栈是一种后进先出(LIFO)的数据结构,可以通过 push() 函数将元素压入栈顶,通过 pop() 函数将栈顶元素弹出。栈还有一个 top() 函数,用于返回栈顶元素,但不会将其弹出。通过 empty() 函数可以判断栈是否为空,通过 size() 函数可以返回栈中元素的个数。

在这个问题中,我们使用了栈来判断表达式中的括号是否匹配。每当遇到一个左括号时,就将其压入栈中;每当遇到一个右括号时,就将栈顶元素弹出,同时判断其是否为左括号。如果是左括号,则说明该右括号与之匹配,将左右括号个数均减 1;否则说明该表达式不符合要求,将右括号个数加 1,继续向后遍历。最后,判断栈是否为空且右括号个数是否为 0,若是,则说明表达式括号匹配,输出"YES",否则输出"NO"。

C++ STL 库中的栈容器可以通过 #include <stack> 引入。栈的定义方式为 stack<type> name;,其中 type 为栈中元素的类型,name 为栈的名称。常用的函数包括 push()、pop()、top()、empty() 和 size()。
  1. #include <iostream>
  2. #include <string>
  3. #include <stack>
  4. using namespace std;

  5. stack<char> p; // 用于存储左括号的栈
  6. string st; // 用于存储输入的字符串
  7. int ind, cnt; // ind: 左括号个数, cnt: 右括号个数

  8. int main() {
  9.     getline(cin, st); // 读取输入的字符串
  10.     int len = st.size(); // 获取字符串的长度
  11.     for (int i = 0; i < len; i++) { // 遍历字符串中的每一个字符
  12.         if (st[i] == '@') break; //当遍历到字符@跳出循环
  13.         if (st[i] == '(') { // 如果该字符为左括号
  14.             p.push(st[i]); // 将其压入栈中
  15.             ind++; // 左括号个数加1
  16.         }
  17.         if (st[i] == ')') { // 如果该字符为右括号
  18.             cnt++; // 右括号个数加1
  19.             if (ind && p.top() == '(') { // 如果此时左括号个数不为0且栈顶为左括号
  20.                 p.pop(); // 弹出栈顶元素
  21.                 ind--; // 左括号个数减1
  22.                 cnt--; // 右括号个数减1
  23.             }
  24.         }
  25.     }
  26.     if (p.empty() && !cnt) cout << "YES"; // 如果栈为空且右括号个数为0,说明括号匹配,输出"YES"
  27.     else cout << "NO"; // 否则输出"NO"
  28.     return 0;
  29. }
复制代码


回复

使用道具 举报

35

主题

54

帖子

4532

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4532
发表于 2023-3-28 18:53:46 | 显示全部楼层
没有看到代码哦
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2023-3-28 22:25:32 | 显示全部楼层
雷老师,代码加上了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表