题目如下:
字符串以#结尾,若匹配则输出1,否则输出0
算法思想:
检测字符串,如果为左括号就进入栈,如果为右括号就与栈顶元素匹配,如果成功则栈顶元素出栈,否则返回匹配失败结果,字符串扫描结束时如果栈内为空则全部匹配成功,若栈中还有剩余的左括号,则说明未全部匹配。
特殊情况:
如"( ) ] { } "在这种情况下,先检测到' ( '压入栈中,检测到' ) '匹配成功,令栈顶元素出栈,此时继续检测字符串,遇到' ] ',此时栈内为空,而调用top函数会使程序无法进行,因此在检测到右括号时,还需要判断栈是否为空,若为空可直接返回匹配失败。
完整代码:
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<char> Rbrace;
char temp;
while(1){
cin>>temp;
if(temp == '#')//结束输入
break;
if((temp == '(')||(temp == '{')||(temp == '['))//左括号则存入栈中
Rbrace.push(temp);
//如果为右括号就与栈顶元素匹配
if(temp == ')')
{
if(Rbrace.empty())//检测栈是否为空
{
cout<<'0';
return 0;
}
else if(Rbrace.top() != '(')//检测是否匹配
{
cout<<'0';
return 0;
}
else
Rbrace.pop();//匹配成功就使栈顶元素出栈,继续扫描字符串
}
if(temp == '}')
{
if(Rbrace.empty())
{
cout<<'0';
return 0;
}
else if(Rbrace.top() != '{')
{
cout<<'0';
return 0;
}
else
Rbrace.pop();
}
if(temp == ']')
{
if(Rbrace.empty())
{
cout<<'0';
return 0;
}
else if(Rbrace.top() != '[')
{
cout<<'0';
return 0;
}
else
Rbrace.pop();
}
}
//字符串扫描结束时如果栈内为空则全部匹配成功
if(Rbrace.empty())
cout<<1;
else
cout<<0;
return 0;
}