【题目链接】
【题目考点】
1. 栈
【解题思路】
遍历字符串,左括号入栈,遇到右括号时,看栈顶括号与右括号是否能配对。如果两个括号都是小括号或中括号,那么二者配对,左括号出栈。否则括号不匹配。
如果遍历到右括号时,发现栈空,那么存在右括号无法匹配。
如果遍历结束时,栈不为空,那么存在左括号无法匹配。
【题解代码】
解法1:用数组及表达式实现栈
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[260], stk[260];
scanf("%s", s);
int top = 0, len;
len = strlen(s);
for(int i = 0; i < len; ++i)
{
if(s[i] == '(' || s[i] == '[')//左括号入栈
stk[++top] = s[i];
else if(s[i] == ')' || s[i] == ']')
{
if(top == 0 ||
s[i] == ')' && stk[top] != '(' ||
s[i] == ']' && stk[top] != '[')//栈空或括号不配对
{
printf("Wrong");//无法配对
return 0;
}
else
top--;
}
}
if(top == 0)//如果栈不空,则无法配对
printf("OK");
else
printf("Wrong");
return 0;
}
解法2:使用C++ STL
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
stack<char> stk;
for(int i = 0; i < s.length(); ++i)
{
if(s[i] == '(' || s[i] == '[')//左括号入栈
stk.push(s[i]);
else if(s[i] == ')' || s[i] == ']')
{
if(stk.empty() ||
s[i] == ')' && stk.top() != '(' ||
s[i] == ']' && stk.top() != '[')//栈空或括号不配对
{
cout << "Wrong";//无法配对
return 0;
}
else
stk.pop();
}
}
if(stk.empty())//如果栈不空,则无法配对
cout << "OK";
else
cout << "Wrong";
return 0;
}