题目描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ](
)或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK”,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK
输入
输入仅一行字符(字符个数小于255)
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
样例输入
[(])
样例输出
Wrong
读者可以先阅读相似例题及思路
本题AC代码
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool ispair(char a,char b)
{
if (a == '(' && b == ')') return true;
if (a == '[' && b == ']') return true;//匹配
return false;//不匹配
}
int main()
{
string s;
while (cin >> s)
{
if (s.empty())
{
cout << "OK" << endl;
continue;
}
else
{
stack<char> st;//初始化栈,类型为字符型
st.push(s[0]);//将字符串的第一个元素入栈
for (int i = 1;i < (int)s.size();i++)
{
if (!st.empty() && ispair(st.top(),s[i]))
{
//栈非空且栈顶元素与当前元素匹配
st.pop();
}
else st.push(s[i]);
}
//循环完毕进行判断
if (!st.empty()) cout << "Wrong" << endl;
else cout << "OK" << endl;
}
}
return 0;
}
注意:本代码必须使用cin >> s读入,否则不能AC
AC代码2
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool ispair(char a,char b)
{
if (a == '(' && b == ')') return true;
if (a == '[' && b == ']') return true;//匹配
return false;//不匹配
}
int main()
{
string s;
while (getline(cin,s))
{
getchar();//吃getline读入的回车,否则不能AC
if (s.empty())
{
cout << "OK" << endl;
continue;
}
else
{
stack<char> st;//初始化栈,类型为字符型
st.push(s[0]);//将字符串的第一个元素入栈
for (int i = 1;i < (int)s.size();i++)
{
if (!st.empty() && ispair(st.top(),s[i]))
{
//栈非空且栈顶元素与当前元素匹配
st.pop();
}
else st.push(s[i]);
}
//循环完毕进行判断
if (!st.empty()) cout << "Wrong" << endl;
else cout << "OK" << endl;
}
}
return 0;
}
注意:本代码必须吃getline读入的回车,否则不能AC