题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1-左括号必须用相同类型的右括号闭合。
2-左括号必须以正确的顺序闭合。
示例1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
思路:
1-解决办法为栈,先提取存储括号的字符串s,如果是左括号就依次放入栈里,如果是右括号就弹出栈顶与它匹配,匹配上了这一步就是正确的,否则就是错误的。也就是说假如先来了好几个左括号就都存进去了,但是一旦来了一个右括号,它就必须和栈顶的这个左括号匹配上,否则就是错误的。这就是栈的基本思路。
2-需要的函数:
- 首先我们需要一个栈,这个栈里面俩参数,一个存字符、一个存栈顶。
- 需要初始化栈顶数据用于判断栈是否为空。
- 入栈、出栈赋值。
- 循环括号匹配。
- 有效性检查,这里就是官方提示的函数。注意这里需要将字符串类型转换为字符数组类型,才可以应用于栈。
3-补充知识:
char:是字符指针数据类型,它的本质是个指针,也就是地址,它指向了一个char类型的内存单元。
栈:先进后出
strcpy错误:包含头文件#include <cstring>
代码:
#define MAXSize 10000
using namespace std;
#include <cstring>
class Solution {
public:
struct Stack{
char data[MAXSize];
int top; //栈顶指针
};
//初始化栈
void InitStack(Stack &S){
S.top = -1;
}
//判断栈是否为空
bool StackEmpty(Stack S){
if(S.top == -1){
return true;
}else{
return false;
}
}
//入栈 栈对象S和括号组x
bool Push(Stack &S, char m){
if(S.top == MAXSize-1){
return false;
}else{
S.top++;
S.data[S.top] = m; //S.top指向栈顶
return true;
}
}
//出栈
bool Pop(Stack &S, char &m){
if(S.top == -1){
return false;
}else{
m = S.data[S.top--]; //先赋值再--
return true;
}
}
//获取长度
int GetLength(char str[]){
int i = 0;
while(str[i] != '\0'){
i++;
}
return i;
}
//括号匹配
bool Match(char str[], int len){
Stack S;
InitStack(S);
for(int i = 0; i < len; i++){
if (str[i] == '(' || str[i] == '{' || str[i] == '['){
Push(S, str[i]); //扫描到左括号,入栈
}else{
if(StackEmpty(S)){ //扫描到右括号,且栈为空
return false;
}
char topElem;
Pop(S, topElem); //栈顶元素出栈
if(str[i] == ')' && topElem != '('){
return false;
}
if(str[i] == '}' && topElem != '{'){
return false;
}
if(str[i] == ']' && topElem != '['){
return false;
}
}
}
return StackEmpty(S); //全部匹配结束栈空为成功
}
public:
bool isValid(string s) {
string e = s;
// cout << s;
char w[MAXSize];
strcpy(w,e.c_str());
// cout << w;
int len = GetLength(w);
// cout << len;
bool result = Match(w, len);
if(result == 1){
return true;
}else{
return false;
}
}
};
简单解算办法:
class Solution {
public:
bool isValid(string s) {
int len = s.size();
if(len%2==1)
return false;
stack<int> ans;
for(int i =0; i < len; i++){
if(s[i]=='(' || s[i]=='{' || s[i]=='['){
ans.push(s[i]);
}
if(s[i]==')' || s[i]==']' || s[i]=='}'){
if(ans.size()<1)
return false;
char c = ans.top();
ans.pop();
if((s[i]==')'&&c!='(') || (s[i]==']'&&c!='[') || (s[i]=='}'&&c!='{' )){
return false;
}
}
}
if(ans.size()>0)
return false;
return true;
}
};
问题:
1-形参有时候值传递,有时候引用传递区别是什么?
2-第一种方法提交会出错,目前没有找到解决办法?-----解决:maxsize设置为10000即可