当前位置:首页 > C++知识 > 正文内容

【数据结构】栈—表达式括号匹配

亿万年的星光4年前 (2021-02-19)C++知识20124

【题目描述】

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

【输入描述】

一行数据,即表达式。

【输出描述】

一行,即“YES” 或“NO”。

【样例输入】

2*(x+y)/(1-x)@

【样例输出】

YES

【题目分析与思路】

  1. 所有的括号匹配正确才是yes,多一个少一个都不行

  2. 本题考虑栈的思想,遇到一个左括号就入栈,如果遇到右括号就让一个左括号出栈

  3. 括号数量一定是匹配的,否则就是NO


                             


#include<iostream>
#include<stack>
#include<cstring> 
using namespace std;
char str[1000];
stack<int> S;
int main() {
	gets(str);
	int len=strlen(str);
	for(int i=0; i<len; i++) {
		if(str[i]=='(')//记录左括号
			S.push(1);
		else if(str[i]==')') { //记录右括号
			if(!S.empty())//栈不为空时
				S.pop();
			else
				S.push(1);
		}
	}
	if(S.empty())//栈为空说明匹配
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【算法】分治算法

前言所谓分治算法就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法称为二分法。比如,我们玩过最简单的猜...

【数论】龟速乘

【数论】龟速乘

我们前面一篇文章学习了快速幂。它可以解决两类问题:a^b,(a^b)%c对于第一类,我们可以使用递归法或者迭代法可以求出,为了计算的快,我们可以引入位运算操作,但是目前来看,无论怎么优化都不能超过lo...

CSP-J2021年普及组复赛T2——插入排序

CSP-J2021年普及组复赛T2——插入排序

【题目描述】插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老 师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n 2...

如何估算时间复杂度

首先:  常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)时间复杂度可以简单理解为最多执...

c++ 如何用链表存取数据

c++ 如何用链表存取数据

由于单链表的每个结点都有一个数据域和一个指针域。所以,每个结点可以定义成一个记录。其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(这就是传说中的结构...

第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

第十四届全国青少年信息学奥林匹克联赛初赛试题             ...