首页 > 其他分享 >DS堆栈--括号匹配

DS堆栈--括号匹配

时间:2024-09-23 14:19:36浏览次数:9  
标签:匹配 -- 括号 输入 堆栈 DS 表达式 op

题目描述

处理表达式过程中需要对括号匹配进行检验,括号匹配包括三种:“(”和“)”,“[”和“]”,“{”和“}”。例如表达式中包含括号如下:

(	)	[	(	)	(	[	]	)	]	{	}
1	2	3	4	5	6	7	8	9	10	11	12

从上例可以看出第1和第2个括号匹配,第3和第10个括号匹配,4和5匹配,6和9匹配,7和8匹配,11和12匹配。从中可以看到括号嵌套的的情况是比较复杂的,使用堆栈可以很方便的处理这种括号匹配检验,可以遵循以下规则:

1、 当接收第1个左括号,表示新的一组匹配检查开始;随后如果连续接收到左括号,则不断进堆栈。

2、 当接受第1个右括号,则和最新进栈的左括号进行匹配,表示嵌套中1组括号已经匹配消除

3、 若到最后,括号不能完全匹配,则说明输入的表达式有错

建议使用C++自带的stack对象来实现

stack类使用的参考代码

n包含头文件<stack>  :  #include <stack>

n创建一个堆栈对象s(注意stack是模板类):stack <char>  s; //堆栈的数据类型是字符型

n把一个字符ct压入堆栈: s.push(ct);

n把栈顶元素弹出:s.pop();

n获取栈顶元素,放入变量c2: c2 = s.top();

n判断堆栈是否空: s.empty(),如果为空则函数返回true,如果不空则返回false

输入

第一行输入一个t,表示下面将有t组测试数据。接下来的t行的每行输入一个表达式,表达式只考虑英文半角状态输入,无需考虑中文全角输入

输出

对于每一行的表达式,检查括号是否匹配,匹配则输入ok,不匹配则输出error

 

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		string op;
		cin >> op;
		stack<char>s;
		int f = 0;
		for (int i = 0; i < op.size(); ++i)
		{
			if (op[i] == '(' || op[i] == '[' || op[i] == '{')
			{
				s.push(op[i]);
			}
			else if (op[i] == ')')
			{
				if (!s.empty()&&s.top() == '(')s.pop();
				else
				{
					f = 1;
					cout << "error\n";
					break;
				}				
			}
			else if (op[i] == '}')
			{
				if (!s.empty() && s.top() == '{')s.pop();
				else
				{
					f = 1;
					cout << "error\n";
					break;
				}
			}
			else if (op[i] == ']' )
			{
				if (!s.empty() && s.top() == '[')s.pop();
				else
				{
					f = 1;
					cout << "error\n";
					break;
				}
			}			
		}
		if (s.empty()&&f==0)
		{
			cout << "ok\n";
		}
		else if(f==0)
		{
			cout << "error\n";
		}
	}
}

标签:匹配,--,括号,输入,堆栈,DS,表达式,op
From: https://blog.csdn.net/2301_80770184/article/details/142457520

相关文章

  • DS循环链表—约瑟夫环
    题目描述N个人坐成一个圆环(编号为1-N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。例如:N=3,K=2,S=1。2号先出列,然后是1号,最后剩下的是3号。要求使用循环链表实现。输入测试数据有多组每组包括3个数N、K、S,表示有N个人,从第S个......
  • DS堆栈--逆序输出(不使用STL栈)
    题目描述请编写堆栈操作的具体实现代码,实现字符串的逆序输出,需自行实现堆栈。输入一个字符串,按字符按输入顺序压入堆栈,然后根据堆栈后进先出的特点,做逆序输出输入第一行输入t,表示有t个测试实例第二起,每一行输入一个字符串,注意字符串不要包含空格字符串的输入可参考如下......
  • EC2机器上MySQL8 修改关闭binlog以及修改保存时间
    从库清空binlog因为MySQL8.0要修改配置文件,在mysqld下面增加skip-log-bin,且需要重启,所以换种思路直接将其设置为3分钟。##单位秒setglobalbinlog_expire_logs_seconds=180;##flushlogs;showbinarylogs;##清理日志,别一下全删完了,删到倒数第二个purgebinarylogs......
  • docker部署paddleocr过程中遇到的问题
    坑1:尝试了下面csdn博客中的解决方案,但是不太行,后来发现是paddlepaddle-gpu的版本问题,版本改对后就OK了https://blog.csdn.net/weixin_43021830/article/details/128243800坑2:困扰了一周了,还是卡住了,目前尝试解决的两个思路1、将paddleocr模块添加到python解释器的搜索路径......
  • Python中Sha加密算法
    '''DES:Python3.x中的加密在python3的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,hashlib模块就包括了SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。通常我们的加密,都是对二进制编码的格式进行加密的;而在Python中,使用的是Bytes......
  • OpenCV(cv::convertScaleAbs())
    目录1.函数定义2.原理3.示例4.参数作用详解4.1alpha的作用4.2beta的作用5.应用场景6.cv::convertScaleAbs()与cv::normalize()的区别总结cv::convertScaleAbs()是OpenCV中用于将图像像素值缩放并转换为8位无符号整数类型的函数。它常用于处理计算结果为浮点......
  • 欧拉函数φ
    欧拉函数欧拉函数,即\(\varphi(n)\),表示的是小于等于\(n\)和\(n\)互质的数的个数,详细定义看wiki。欧拉函数其实就是容斥原理的应用,举个例子:如\(n=6\),\(1,2,3,4,5,6\)是整个序列,我们将\(6\)的质因子\(2\),\(3\)取出,减去小于等于\(6\)的\(2\)的倍数和\(3\)的倍数,......
  • MFC 程序基本界面配置
    不经常写MFC程序,虽然MFC的基础界面配置较为简单,但是每次很久没写MFC,再写的时候各种搜资料感觉还是挺麻烦的,所以写一个MFC的基本界面配置笔记,主要记录如何设置窗体大小、设置标题、修改图标、添加最大化最小化按钮、添加背景图等等,方便后续查阅。当然,我们首先要新建一个MF......
  • CF2006A Iris and Game on the Tree
    题目链接题解知识点:贪心,博弈论。一个\(01\)串中\(01,10\)的个数差只与首尾两个字符相关,若首尾字符相同,则个数差为\(0\),否则为\(1\)或\(-1\)。因此,树上除了根节点和叶子节点的\(?\)是不影响叶子节点权值的(但可能影响策略,导致答案不一样),我们只需要考虑叶子节点和根......
  • 我来博客园了!
    \(\large{\texttt{HelloWorld!}}\)来\(\text{CnBlogs}\)的第一天今天是我第一天来到博客园,这里的一切都是如此的新鲜!作为一名来自河南省的初中生现在我的能力还菜的一批\(\dots\)我会什么作为全国统一的,每天晚上我也不可避免地染上\(\text{emo}\)的恶疾(雾,尽管有时会产出一......