算法思想:
//初始化一个空栈,扫描表达式,依次读入字符,知道表达式扫描完或出现错误匹配
1.如果是'{'或'(',则将其压栈
2.如果是')'则根据当前栈顶元素进行分情况考虑,若是'('则此次匹配成功 ,否则非法,直接匹配不成功
3. 如果是'}'同2上面的处理方法。
//*****************括号匹配*********************
#include <iostream>
#include <stdlib.h>
using namespace std;
#define MAXSIZE 100
typedef struct
{
char *base;
char *top;
int stacksize;
}Stack;
//初始化占
void Initstack(Stack &S)
{
S.base = new char[MAXSIZE];
if(!S.base)
{
exit(1);
}
S.top = S.base;
S.stacksize = MAXSIZE;
}
//入栈
void Push(Stack &S,char c)
{
if(S.top - S.base == S.stacksize)
{
cout<<"满!"<<endl;
exit(1);
}
*S.top++ = c;
}
//出栈
void Pop(Stack &S,char &c)
{
if(S.base == S.top)
{
cout<<"空栈!"<<endl;
exit(1);
}
c = *--S.top;
}
//取栈顶元素
void GetTop(Stack &S,char &c)
{
if(S.base == S.top)
{
cout<<"空!";
exit(1);
}
c = *(S.top-1);
}
//判断栈是否为空 空返回ture 不空返回false
bool StackEmpty(Stack &sta)
{
if(sta.base == sta.top)
{
return true;
}
else
{
return false;
}
}
//括号匹配
bool Matching_Brackets(Stack &sta)
{
int flag = 1;
char x;
char ch;
cin>>ch;
while(ch != '#' && flag)
{
switch(ch)
{
case '{':
{
Push(sta,ch);
}
break;
case '(':
{
Push(sta,ch);
}
break;
case ')':
{
GetTop(sta,x);
if(!StackEmpty(sta) && x == '(')
{
Pop(sta,x);
}
else
{
flag = 0;
}
}
break;
case '}':
{
GetTop(sta,x);
if(!StackEmpty(sta) && x == '{')
{
Pop(sta,x);
}
else
{
flag = 0;
}
}
break;
}
cin>>ch;
}
/*括号情况: {()} 成功
{()) 不成功
{{()} 不成功
{()}} 不成功 这种情况就用到了 maching中case的 if中!StackEmpty函数的判断了
*/
/*左括号全部进栈分两种情况:1,括号数量(count)为奇数 2,括号数量为偶数
当执行到下面if语句是,若是flag为1则可能匹配,同时count为偶数是,若为基数
可能此时栈中不空,则匹配也失败*/
if(StackEmpty(sta) && flag)
return true;
else
return false;
}
int main()
{
cout<<"******以#结束输入******"<<endl;
Stack sta;
Initstack(sta);
bool B = Matching_Brackets(sta);
if(B == true)
{
cout<<"匹配成功!"<<endl;
}
else
{
cout<<"匹配不成功!"<<endl;
}
return 0;
}