Go: package main

import (
	"bufio"
	"fmt"
	"os"
)

var sc = bufio.NewScanner(os.Stdin)

func nextString() string {
	sc.Scan()
	return sc.Text()
}

func main() {
	sc.Buffer(make([]byte, 0), 1000000009)

	for {
		var s string
		s = nextString()
		if s == "." {
			break
		}
		var st []byte
		is_valid := true

		for _, value := range s {
			if value == '(' {
				st = append(st, byte(value))
			}
			if value == '[' {
				st = append(st, byte(value))
			}
			if value == ')' {
				if len(st) == 0 || st[len(st)-1] != '(' {
					is_valid = false
					break
				} else {
					st = st[:len(st)-1]
				}
			}
			if value == ']' {
				if len(st) == 0 || st[len(st)-1] != '[' {
					is_valid = false
					break
				} else {
					st = st[:len(st)-1]
				}
			}
		}
		if len(st) != 0 {
			is_valid = false
		}
		if is_valid {
			fmt.Println("yes")
		} else {
			fmt.Println("no")
		}
	}
}

C++: #include<iostream>
#include<string.h>
#include<string>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
#include<set>
#define ll long long int
#define ld long double
#define INF 1000000000
#define EPS 0.0000000001
#define rep(i,n) for(i=0;i<n;i++)
using namespace std;
typedef pair<int, int> pii;

int main()
{
  while(1){
    stack<int> sta;//[]:1 ():2 
    bool ans=true;
    char c[150];
    gets(c);
    if(c[0]=='.')break;
    else if(c[0]=='[')sta.push(1);
    else if(c[0]=='(')sta.push(2);
    else if(c[0]==']' || c[0]==')')ans=false;
    int i=0;
    while(ans){
      i++;
      // printf("c='%c'\n",c[i]);
      if(c[i]=='[')sta.push(1);
      else if(c[i]=='(')sta.push(2);
      else if(c[i]==']')
	if(sta.size() && sta.top()==1)sta.pop();
	else{
	  ans=false;
	  break;
	}
      else if(c[i]==')')
	if(sta.size() && sta.top()==2)sta.pop();
	else{
	  ans=false;
	  break;
	}
      else if(c[i]=='.')break;
    }
    if(sta.size()==0 && ans)cout<<"yes"<<endl;
    else{
      cout<<"no"<<endl;
    }
  }

}

C++: #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <map>
#include <set>

#define rep(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define all(v) (v).begin(), (v).end()
#define rev(s) string((s).rbegin(), (s).rend())
#define MP make_pair
#define X first
#define Y second

using namespace std;

typedef long long int ll;
typedef pair<int, int> P;

int main(){

	char m[200];

	m[')'] = '(';
	m[']'] = '[';

	while(1){
		string s;
		getline(cin, s);
		if(s.size() == 1 && s[0] == '.')break;
		stack<char> st;
		rep(i, s.size()){
			if(s[i] == '(' || s[i] == '[') st.push(s[i]);
			if(s[i] == ')' || s[i] == ']'){
				if(st.size() < 1){
					st.push('a');
					break;
				}
				if(st.top() == m[s[i]]){
					st.pop();
				}
			}
		}
		cout << (st.size()?"no":"yes") << endl;
	}

	return 0;
}

C++: yes
yes
no
no
no
yes
yes

C++: #include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    while(getline(cin,s)&&s!="."){
        string c;
        int d=1;
        stack<char> w;
        for(int i=0;i<s.size();i++)if(s[i]==')'||s[i]=='('||s[i]=='['||s[i]==']')c+=s[i];
            for(int i=0;i<c.size();i++){
            if(c[i]=='['||c[i]=='(')w.push(c[i]);
            else if(c[i]==']'&&w.top()=='['||c[i]==')'&&w.top()=='(')w.pop();
            else break;
        }
        if(w.empty())cout<<"yes"<<endl;
        else fail:cout<<"no"<<endl;
    }
    return 0;
}

C++: #include<stdio.h>
char s[110],a[110],b,i,t;
main(){
while(fgets(s,110,stdin)){
if(s[1]=='\n'&&s[0]==46)break;
for(t=1,b=0,i=0;s[i]&&t;++i){
if(s[i]==40||s[i]==91) a[b++]=s[i];
else if(s[i]==41||s[i]==93) {
if(!b){t=0;break;}
if((s[i]==41&&a[b-1]==40)||(s[i]==93&&a[b-1]==91)) --b;
else t=0;
}
}
puts(((t&&!b)?1:0)?"yes":"no");
}
}

C++: #include <iostream>
#include <stack>
#include <string>

using namespace std;

int main()
{
    while (true) {
        string s;
        getline(cin, s);
        if (s[0] == '.') {
            break;
        }

        stack<char> st;
        bool ok = true;
        for (auto&& c : s) {
            if (!ok) {
                break;
            }
            switch (c) {
            case '(':
                st.push(c);
                break;
            case '[':
                st.push(c);
                break;
            case ')':
                if (!st.empty() && st.top() == '(') {
                    st.pop();
                }
                else {
                    ok = false;
                }
                break;
            case ']':
                if (!st.empty() && st.top() == '[') {
                    st.pop();
                }
                else {
                    ok = false;
                }
                break;
            }
        }
        if (ok && st.empty()) {
            printf("yes\n");
        }
        else {
            printf("no\n");
        }
    }
}

C++: #include<iostream>
#include<stack>
using namespace std;main(){int i,f,c;for(string s;getline(cin,s),s[0]-'.';){stack<char> t;for(f=i=0;c=s[i++],c!='.';){if(c==40|c==91)t.push(c);if(c==41|c==93){if(!t.empty()&&c-t.top()<3)t.pop();else f=1;}}puts(!f&t.empty()?"yes":"no");}}

C++: #include <bits/stdc++.h>
using namespace std;

int main() {
   while (1) {
      string s;
      getline(cin, s);
      if (s == ".") break;

      int n = s.size();
      stack<char> stk;
      bool ok = false;
      for (int i = 0; i < n; i++) {
         if (s[i] == '(') stk.push(s[i]);
         if (s[i] == '[') stk.push(s[i]);

         if (s[i] == ')') {
            // )と対応しない
            if (stk.size() == 0 || stk.top() != '(') {
               ok = true;
               break;
            }
            // )と対応する
            stk.pop();
         }
         if (s[i] == ']') {
            // ]と対応しない
            if (stk.size() == 0 || stk.top() != '[') {
               ok = true;
               break;
            }
            // [と対応する
            stk.pop();
         }
      }
      if (!ok && stk.empty()) {
         puts("yes");
      } else {
         puts("no");
      }
   }

   return 0;
}