表達式括號匹配

【題目描述】

    假設一個表達式有英文字母(小寫)和數字、運算符(+,—,*,/)和左右小(圓)括號構成,以“@”作爲表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表達式長度小於255,左圓括號少於20個。

【輸入格式】
輸入文件包括一行數據,即表達式,
【輸出格式】
輸出文件包括一行,即“YES” 或“NO”。
【樣例輸入】
2*(x+y)/(1-x)@
【樣例輸出】

YES

分析:此題只需判斷括號是否匹配,其他的都不需要考慮,這樣可以把題簡化成只對括號的操作,那讓我們看看,不合法的括號有哪些
1:當出現')'後前面沒有相應的'('對應。
2:當整個表達式都判斷完了還有'('沒有相應的')'與之配對
所以算法可以這樣設計
1.對整個表達式進行遍歷,當爲非括號或括回時不做任何處理直接判斷下一字符
2.如果當前字符爲'('直接把它入棧
3.如果當前字符爲')'時,首先判斷棧是否爲空,如果爲空直接可以判定不匹配,如果非空,直接把棧頂元素出棧
4.當整個表達式遍歷完畢,如果當前棧爲空則表明是匹配,非空表明還有'('沒有相應的')' 相匹配

c++代碼

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
string s;
stack<char> a;
bool my_judge(string);
int main()
{	
	cin>>s;
	if(my_judge(s))cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
}
bool my_judge(string s)
{
	int i=0;
	while(s[i]!='@')
	{
		if(s[i]=='(')a.push(s[i]);
		if(s[i]==')')
		{
			if(a.empty()) return false;
			a.pop();
		}
		i++;
	}
	if(a.empty())return true;
	else return false;
}


發佈了29 篇原創文章 · 獲贊 14 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章