算法思想
1.初始化一个栈,顺序读入括号;
2.若为左括号“(,[,{”,则压入栈中;
3.若为又括号“),],}”,则与栈顶元素进行匹配:
①:若匹配,则弹出栈顶元素;
②:若不匹配,则该序列不合法.
4.若遍历结束,栈空则合法,否则不合法.
操作函数
void InitStack(sqStack &s);//初始化栈
void Push(sqStack &s,char c);//若为左括号“([{”,则入栈
void Pop(sqStack &s);//弹栈
char Top(sqStack s);//栈顶元素
int Bracket_Match(sqStack s,char* c);//括号匹配
运行代码
#include "stdafx.h"
#include<iostream>
using namespace std;
#define MaxSize 100
typedef struct sqStack
{
char data[MaxSize];
int top;
}sqStack;
void InitStack(sqStack &s);//初始化栈
void Push(sqStack &s,char c);//若为左括号“([{”,则入栈
void Pop(sqStack &s);//若匹配,则出栈
char Top(sqStack s);//栈顶元素
int Bracket_Match(sqStack s,char* c);//括号匹配
int _tmain(int argc, _TCHAR* argv[])
{
sqStack s;
InitStack(s);
char a[]="{()[]}";
char b[]="{()[}";
char c[]="{()}]";
Bracket_Match(s,a);
Bracket_Match(s,b);
Bracket_Match(s,c);
system("pause");
return 0;
}
void InitStack(sqStack &s)
{
s.top=-1;
}
void Push(sqStack &s,char c)
{
s.data[++s.top]=c;
}
void Pop(sqStack &s)
{
s.top--;
}
char Top(sqStack s)
{
return s.data[s.top];
}
int Bracket_Match(sqStack s,char* c)
{
for(int i=0;i<strlen(c);i++)//打印
{
cout<<c[i];
}cout<<'\t';
for(int i=0;i<strlen(c);i++)//遍历括号序列
{
if(c[i]=='('||c[i]=='['||c[i]=='{')//若为左括号,则压栈
Push(s,c[i]);
//若为右括号,则进行匹配
else if((a[i]==')'&&s.top()=='(')||(a[i]==']'&&s.top()=='[')||(a[i]=='}'&&s.top()=='{'))
s.pop();
else
{
cout<<"不匹配";
return 0;
}
}
if(s.top==-1)//遍历结束时,空栈匹配成功,栈非空则不合法
cout<<"匹配"<<endl;
else
cout<<"233"<<endl;
return 0;
}
运行结果
代码改进
#include "stdafx.h"
#include<iostream>
using namespace std;
#include<stack>
int bracket_match(char* c);
int _tmain(int argc, _TCHAR* argv[])
{
char c[]={"([{}])"};
bracket_match(c);
system("pause");
return 0;
}
int bracket_match(char* c)
{
stack<char> s;
for(int i=0;i<strlen(c);i++)
{
if(c[i]=='('||c[i]=='['||c[i]=='{')
s.push(c[i]);
else if(c[i]==')'&&s.top()=='(')
s.pop();
else if(c[i]==']'&&s.top()=='[')
s.pop();
else if(c[i]=='}'&&s.top()=='{')
s.pop();
else
{
cout<<"不匹配"<<endl;
return 0;
}
}
if(!s.empty())
{
s.pop();
cout<<"不匹配"<<endl;
}
else
cout<<"匹配"<<endl;
return true;
}