问题:
Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: “()”
Output: true
Example 2:
Input: “()[]{}”
Output: true
Example 3:
Input: “(]”
Output: false
Example 4:
Input: “([)]”
Output: false
Example 5:
Input: “{[]}”
Output: true
问题描述:
判断输入的字符串是否能构成“闭合”,规则有三个:
1.打开的括号必须由相同类型的括号关闭。
2.打开的括号必须按正确的顺序关闭。
3.空字符串也被认为是有效的。
解题思路:
一定要想到用栈的特性来解决这个问题,C语言实现代码如下:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
char s[520];//大小随意定义的,题目没有要求!
cin >> s;
stack<char> p;
int n = strlen(s);
for(int i=0;i<n;i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
p.push(s[i]);//如果是括号的前半部分,就入栈。
else
{
if((s[i]==')'&&p.top()=='(')||(s[i]==']'&&p.top()=='[')||(s[i]=='}'&&p.top()=='{'))
p.pop();//如果现在的元素与栈顶元素相同则删除栈顶元素。
}
}
if(p.empty()==0)//判断栈是否不空。
cout<<"false";
else
cout<<"true";
}
LeetCode的C++代码如下:
class Solution {
public:
bool isValid(string s) {
stack<int> sta;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
sta.push(s[i]);
}
else if (s[i] == ')' || s[i] == ']' || s[i] == '}') {
if(sta.size() == 0) return false;
switch (sta.top()) {
case '(':
if (s[i] == ')') sta.pop();
else return false;
break;
case '[':
if (s[i] == ']') sta.pop();
else return false;
break;
case '{':
if (s[i] == '}') sta.pop();
else return false;
break;
}
}
else {
return false;
}
}
if (sta.size() > 0) return false;
return true;
}
};