转自:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html
1.如果使用number计数的话,只能使用与单个括号匹配,对于多个括号不适用
2.括号不可是html中的标签,只需约定括号的通用格式
/*
括号匹配问题,比较经典,利用堆栈来实现(摘自internet)
1. 括号匹配的四种可能性:
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确
2. 算法思想:
顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
否则,括号配对正确。
3. 程序实现:
*/
#include < iostream >
using namespace std;
#define maxsize 100
struct sStack
{
char sign[maxsize];
int top;
};
int InitsStack(sStack & SS)
{
SS.top =- 1 ;
return 1 ;
}
int IsEmptysStack(sStack & SS)
{
if (SS.top ==- 1 )
return 1 ;
return 0 ;
}
int PushsStack(sStack & SS, char c)
{
SS.sign[ ++ SS.top] = c;
return 1 ;
}
int UpsStack(sStack & SS)
{
if (IsEmptysStack(SS))
{
cout << " 栈空 " << endl;
return 0 ;
}
SS.top -- ;
return 1 ;
}
char TopsStack(sStack & SS)
{
if (IsEmptysStack (SS))
{
cout << " 栈空 " << endl;
return 0 ;
}
return SS.sign[SS.top];
}
int main()
{
string s;
cout << " 输入表达式: " ;
cin >> s;
int length = s.length();
int i;
sStack SS;
InitsStack(SS);
for (i = 0 ;i < length; ++ i)
{
if (s[i] == ' ( ' || s[i] == ' [ ' || s[i] == ' { ' )
PushsStack(SS,s[i]);
else if (s[i] == ' ) ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' ( ' )
UpsStack(SS);
else if (s[i] == ' ) ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' ( ' )
cout << " 括号匹配次序不正确 " << endl;
else if (s[i] == ' ] ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' [ ' )
UpsStack(SS);
else if (s[i] == ' ] ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' [ ' )
cout << " 括号匹配次序不正确 " << endl;
else if (s[i] == ' } ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' { ' )
UpsStack(SS);
else if (s[i] == ' } ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' { ' )
cout << " 括号匹配次序不正确 " << endl;
else if ((s[i] == ' ) ' || s[i] == ' ] ' || s[i] == ' } ' ) && IsEmptysStack(SS))
cout << " 右括号多于左括号 " << endl;
}
if ( ! IsEmptysStack(SS))
cout << " 左括号多于右括号 " << endl;
else if (i = (length - 1 ) && IsEmptysStack(SS))
cout << " 括号匹配正确 " << endl;
system( " PAUSE " );
return 0 ;
}
括号匹配问题,比较经典,利用堆栈来实现(摘自internet)
1. 括号匹配的四种可能性:
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确
2. 算法思想:
顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
否则,括号配对正确。
3. 程序实现:
*/
#include < iostream >
using namespace std;
#define maxsize 100
struct sStack
{
char sign[maxsize];
int top;
};
int InitsStack(sStack & SS)
{
SS.top =- 1 ;
return 1 ;
}
int IsEmptysStack(sStack & SS)
{
if (SS.top ==- 1 )
return 1 ;
return 0 ;
}
int PushsStack(sStack & SS, char c)
{
SS.sign[ ++ SS.top] = c;
return 1 ;
}
int UpsStack(sStack & SS)
{
if (IsEmptysStack(SS))
{
cout << " 栈空 " << endl;
return 0 ;
}
SS.top -- ;
return 1 ;
}
char TopsStack(sStack & SS)
{
if (IsEmptysStack (SS))
{
cout << " 栈空 " << endl;
return 0 ;
}
return SS.sign[SS.top];
}
int main()
{
string s;
cout << " 输入表达式: " ;
cin >> s;
int length = s.length();
int i;
sStack SS;
InitsStack(SS);
for (i = 0 ;i < length; ++ i)
{
if (s[i] == ' ( ' || s[i] == ' [ ' || s[i] == ' { ' )
PushsStack(SS,s[i]);
else if (s[i] == ' ) ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' ( ' )
UpsStack(SS);
else if (s[i] == ' ) ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' ( ' )
cout << " 括号匹配次序不正确 " << endl;
else if (s[i] == ' ] ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' [ ' )
UpsStack(SS);
else if (s[i] == ' ] ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' [ ' )
cout << " 括号匹配次序不正确 " << endl;
else if (s[i] == ' } ' &&! IsEmptysStack(SS) && TopsStack(SS) == ' { ' )
UpsStack(SS);
else if (s[i] == ' } ' &&! IsEmptysStack(SS) && TopsStack(SS) != ' { ' )
cout << " 括号匹配次序不正确 " << endl;
else if ((s[i] == ' ) ' || s[i] == ' ] ' || s[i] == ' } ' ) && IsEmptysStack(SS))
cout << " 右括号多于左括号 " << endl;
}
if ( ! IsEmptysStack(SS))
cout << " 左括号多于右括号 " << endl;
else if (i = (length - 1 ) && IsEmptysStack(SS))
cout << " 括号匹配正确 " << endl;
system( " PAUSE " );
return 0 ;
}