一類括號匹配問題

/*
一類括號匹配問題
查看 提交 統計 提問
總時間限制: 1000ms 內存限制: 65536kB
描述
在程序設計中,常常使用小括號強調表達式的運算順序,但是,左右小括號必須匹配。現給定一個不多於500個符號的表達式(串),其中可能存在多個小括號,想檢查小括號的匹配問題。如果存在小括號不匹配,則輸出 mismatch;如果所有小括號匹配,則按左右括號的匹配距離由小到大輸出左、右括號的位置;若多個匹配的距離相等,則左括號先出現的匹配先輸出;如果整個串中沒有小括號,則左右位置均輸出0,即 0,0; ,規定,串中第一個符號的位置爲1。 
匹配距離=右括號位置 - 左括號位置。

例如: 
輸入爲:    (x+y*(z-5)*(x+y))*(x+98) 
輸出爲: 
6,10 
12,16 
19,24 
1,17 
如果輸入爲  (x+y*(z-5))*x+y) 
則不匹配,因爲在最後的反括號沒有相匹配的正括號。因此,輸出: 
mismatch

輸入
一串符號
輸出
按匹配距離的增序輸出匹配對的左右位置,逗號間隔;如果距離相同,則按左括號出現的先後順序輸出;如果整個序列中出現不匹配現象,則輸出 mismatch;
樣例輸入
(x+y*(z-5)*(x+y))*(x+98)
樣例輸出
6,10
12,16
19,24
1,17
與之前一樣,運用了棧的思想
不過此處因爲需要將距離差按照一定順序輸出,故另設了一個set容器以儲存位置
此處需注意的是要自定義比較器,用myComp類來實現
*/
#include<iostream>
#include<algorithm>
#include<stack>
#include<string>
#include<set>
using namespace std;
struct Point
{
	int first,last;
};
struct myComp
{
	bool operator () (const Point & a,const Point & b)
	{
		if((a.last-a.first) != (b.last-b.first))
			return (a.last-a.first) < (b.last-b.first);
		return 	a.first < b.first;
	}
};
int main()
{
	string a;
	cin >> a;
	stack<int> stk;
	set<Point,myComp> delta;
	set<Point>::iterator ite;
	Point sample;
	bool match = true;
	int len = a.size();
	for(int i = 0; i < len; ++i)
	{
		if(a[i] == '(')
			stk.push(i);
		if(a[i] == ')' && stk.empty())
		{
			cout << "mismatch" << endl;
			match = false;
			break;
		}
		if(a[i] == ')' && !stk.empty())
		{
			sample.first = stk.top();
			sample.last = i;
			delta.insert(sample);
			stk.pop();
		}
	}
	if(match)
	{
		for(ite = delta.begin(); ite != delta.end();++ite)
			cout << ite->first+1 << ',' << ite->last+1 << endl;
	}
	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章