/*
一類括號匹配問題
查看 提交 統計 提問
總時間限制: 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;
}
一類括號匹配問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.