编译器在编译的时候,就会使用栈来做运算,存储运算符,分配运算顺序。所以说,语义分析方面的问题,很多都与栈这种数据结构有关。
分析这道题目,假设我们在做数学题算式子,去括号的时候必须去掉里面的括号,才能去外面的括号。这道题也一样,先去除里面的括号,再去除外面的,如果所有的括号都可以去除,最终没有括号了,就说明有效。反之如果有括号没法去除,或者删不干净,就是无效的。
由于去括号的时候,判断括号是否可以去只与前一个括号有关,分析轨迹发现完全符合栈后进先出的性质,所以使用栈。其实,这道题目堪称栈使用的典范!
栈在STL中同样有实现,但是由于结构太过简单比优先队列还简单,我们也可以手写出来一个栈。由于向量存储结构太复杂,可能会影响性能,这里我就使用了基础的链表来构建一个简易的栈。
其实我感觉栈更适合用链表实现的,链表头插头删都只要花费常数时间,而且实现栈不需要查询除了栈顶的元素覆盖了链表的缺点。
struct node{
char val;
node* next;
node (char a):val(a),next(NULL){}
};
class Solution {
public:
bool match(char a,char b){
if(a=='('&&b==')') return true;
if(a=='['&&b==']') return true;
if(a=='{'&&b=='}') return true;
return false;
}
bool isValid(string s) {
node* top=nullptr;
node* temp=top;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='['||s[i]=='{'){
temp=top;
top=new node(s[i]);
top->next=temp;
}else{
if(top==nullptr) return false;
if(match(top->val,s[i])){
temp=top;
top=top->next;
delete temp;
}else{
return false;
}
}
}
if(top==nullptr) return true;
return false;
}
};
看看最后得分,真是一个完美的分数!!!提交了三次,第二次内存100%,第三次就是这个分数。
'g