栈的应用——括号匹配
问题描述:括号匹配,总共有三种符号{},(),[]进行匹配。闭括号前的第一个符号必须为对应的开括号才视为匹配。其余均视为不匹配。例如:[12+5*(8+7)}]。其中()为匹配符号,[}不匹配,]未匹配。
解决思路:
1.遇到开括号入栈。
2.遇到闭括号读取栈顶元素并出栈,与闭括号进行匹配。
3.重复1,2操作至取字符至空。
4.若栈已为空仍有闭括号,则说明此闭括号未匹配。
5.若取完所有字符,栈中仍有开括号,则说明此开括号未匹配。
流程图:
代码:
#include "stack.h" #include<iostream> using namespace std; typedef char Stack_entry; int main() { Stack stack; char c; while((c=cin.get())!='\n')//获取字符直到为空 { if(c=='{'||c=='['||c=='(')//如果为开括号入栈 stack.push(c); if(c=='}'||c==']'||c==')')//如果为闭括号开始匹配 { if(!stack.empty())//栈不为空 { char a; stack.top(a);//读取栈顶元素 stack.pop();//出栈,为了使下一个闭括号进行匹配 if(c=='}'&&a=='{'||c==']'&&a=='['||c==')'&&a=='(') cout<<"括号"<<a<<c<<"匹配"<<endl;//如果为对应的闭括号则匹配成功 else cout<<"括号"<<a<<c<<"不匹配"<<endl;//否则不匹配 } else { cout<<"括号"<<c<<"未匹配"<<endl;//如果栈为空说明没有开括号 } } } while(!stack.empty())//如果闭括号已经匹配完栈里仍有元素,则说明有开括号未匹配,这里用while为了输出所有的未匹配开括号 { char b; stack.top(b); stack.pop(); cout<<"检测到不匹配的开括号"<<b<<endl; } }运行结果: