leetcode20-valid parenthese
題目:Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not。
思路:本題是括號匹配問題,用棧就可以實現。只要找出不匹配的所有情況,分別處理即可。我們會發現共有三種情況:
- 對口形狀不對:(]、([)]
- 括號右多:())
- 括號左多:(()
棧和單連結串列很像,採用頭插法建立單連結串列其實就是在建棧。出棧pop(),進棧push()、讀取棧頂元素peek()都是對頭結點後的第一個節點進行操作。
測試通過程式碼:Your runtime beats 54.59% of javasubmissions
public class Solution{
char data;
Solution next;
public Solution (){
this.next=null;
this.data=0;
}
boolean empty(Solution s){
if(s.next==null) return true;
else return false;
}
//建立棧,程式碼沒有用到
/*
void creatStacklist(Solution s, String str){
for(int i=0;i<str.length();i++){
Solution lnode=new Solution();
lnode.data=str.charAt(i);
lnode.next=s.next;
s.next=lnode;
}
Solution p=s.next;
while(p!=null){
System.out.println(p.data);
p=p.next;
}
}
*/
//進棧操作
void push(Solution s, char data){
Solution lnode =new Solution ();
lnode.data=data;
lnode.next=s.next;
s.next=lnode;
}
//出棧操作
boolean pop(Solution s){
if(s.empty(s)) return false;
else {
Solution p=new Solution ();
p=s.next;
s.next=p.next;
return true;
}
}
//讀取棧頂元素
char peek(Solution s){
char x = 0;
if(s.empty(s)) System.out.println("stack empty");
else{
x=s.next.data;
}
return x;
}
//主函式
public boolean isValid(String str) {
Solution s=new Solution();
char[]a=str.toCharArray();
s.push(s,a[0]);
for(int i=1;i<a.length;i++){
if(a[i]=='('||a[i]=='['||a[i]=='{')
s.push(s, a[i]);
else{
if(s.empty(s)) return false;
else{
char tmp=s.peek(s);
if((tmp=='('&&a[i]==')')||(tmp=='['&&a[i]==']')||(tmp=='{'&&a[i]=='}')){
s.pop(s);
}
else{
return false;
}
}
}
}
if(s.empty(s)){
return true;
}
else {
return false;
}
}
}