Files
Data_Structure/OrigFiles/3-特殊线性表/3-BracketsMatch(括号匹配)/BracketsMatch.cpp

63 lines
1.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/***链栈实现括号匹配***/
#include<iostream>
using namespace std;
#include"LinkStack.h"
//括号的匹配
bool Matching()
{
//检验表达式中所含括号是否正确匹配如果匹配则返回true否则返回false。
//表达式以“#”结束
SNode<char> *S;
InitStack(S);
int flag=1; // 标记查找结果以控制循环及返回结果
char c;
char x;
cin>>c; // 读入第一个字符
while(c!='#' && flag)
{
switch (c){
case '[':
case '(': // 若是左括号,则将其压入栈
cout<<"左括号进栈!"<<endl;
Push(S,c);
break;
case ')' : // 若是右括号“)”,则根据当前栈顶元素的值分情况考虑
GetTop(S,x);
if (!StackEmpty(S) && x=='(' ) // 若栈非空且栈顶元素是“(”,则匹配成功
{
Pop(S,x);
cout<<"右括号出栈!"<<endl;
}
else
flag=0; // 若栈空或栈顶元素不是“(”,则非法
break;
case ']' : // 若是右括号“]”,则根据当前栈顶元素的值分情况考虑
GetTop(S,x);
if (!StackEmpty(S) && x=='[' ) // 若栈顶元素是“[”,则匹配成功
Pop(S,x);
else
flag=0; // 若栈空或栈顶元素不是“[”,则非法
break;
}//switch
cin>>c; //继续读入下一个字符
}//while
DestroyStack(S);
if (StackEmpty(S) && flag )
return true;
else
return false;
}//Matching
int main()
{
int flag;
cout<<"请输入待匹配的表达式,以“#”结束:"<<endl;
flag = Matching();
if(flag)
cout<<"括号匹配成功!"<<endl;
else
cout<<"括号匹配失败!"<<endl;
return 0;
}