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 <bits/stdc++.h>
using namespace std;

int main(){
  
  string str;

  while(1){

    getline(cin, str);
    if(str[0] == '.') break;

    vector<int> v;

    for(int i = 0; i < (int)str.size(); i++){
      if(str[i] == '('){
	v.push_back(0);
      }else if(str[i] == ')'){
	v.push_back(1);
      }else if(str[i] == '['){
	v.push_back(2);
      }else if(str[i] == ']'){
	v.push_back(3);
      }
    }

    int cnt = 0, judge = 0, o[2] = {}, p[2] = {};

    for(int i = 0; i < (int)v.size(); i++){
      if(v[i] == 0){
	for(int j = i+1; j < (int)v.size(); j++){
	  if(v[j] == 1){
	    for(int l = i+1; l < j; l++){
	      if(v[l] == 0) o[0]++;
	      if(v[l] == 1) o[1]++;
	      if(v[l] == 2) p[0]++;
	      if(v[l] == 3) p[1]++;
	      //   cout << o[0] << o[1] << p[0] << p[1] << endl;
	    }
	    
	    if(o[0] == o[1] && p[0] == p[1]){
	      v[i] = 7;
	      v[j] = 7; 
	    }
	      o[0] = o[1] = p[0] = p[1] = 0;

	  }
	}
      }else if(v[i] == 2){
	for(int j = i+1; j < (int)v.size(); j++){
	  if(v[j] == 3){
	    for(int l = i+1; l < j; l++){
	      if(v[l] == 0) o[0]++;
	      if(v[l] == 1) o[1]++;
	      if(v[l] == 2) p[0]++;
	      if(v[l] == 3) p[1]++;
	      //   cout << o[0] << o[1] << p[0] << p[1] <<  v[0] <<endl;
	    }
	    
	  
	    if(o[0] == o[1] && p[0] == p[1]){
	      v[i] = 7;
	      v[j] = 7;
	    }
	    o[0] = o[1] = p[0] = p[1] = 0;
  	  }
	}
      }
      /*   for(int k = 0; k < (int)v.size(); k++){
	   cout << v[k];
	   }
	   cout << endl;
      */
    }
     
    
    for(int i = 0; i < (int)v.size(); i++){
      if(v[i] == 7){
    	cnt++; 
      }
    }

    if(cnt == (int)v.size()){
      cout << "yes" << endl;
      cnt = 0;
    }else if(cnt != (int)v.size()) cout << "No" << endl;
    // cout << cnt << " " << (int)v.size() << endl;
  }
  
  return 0;
}

C++: #include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<complex>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<numeric>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cctype>

#define mp make_pair
#define pb push_back
#define REP(i,a,n) for(int i = a;i < (n);i++)
#define rep(i,n) for(int i = 0;i < (n);i++)
#define all(s) s.begin(), s.end()
#define rall(s) s.rbegin(), s.rend()
#define range(x,min,max) ((min) <= (x) && (x) <= (max))

using namespace std;

typedef long long LL;
typedef vector<int> VI;
typedef vector<vector<int> > VII;
typedef vector<string> VS;
typedef vector<bool> VB;
typedef pair<int,int> PII;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

string s;

int main(){
	cin.tie(0);
   	ios::sync_with_stdio(false);
	while (1) {
		getline(cin, s);
		if (s == ".") break;
		string ans = [&] {
			int c1 = 0, c2 = 0;
			stack<char> sta;
			sta.push('#');
			rep (i, s.size()) {
				if (c1 < 0 || c2 < 0) return "no";
				switch (s[i]) {
					case '(':
						c1++;
						sta.push('(');
						break;
					case '[':
						c2++;
						sta.push('[');
						break;
					case ')':
						c1--;
						if (sta.top() == '[') return "no";
						sta.pop();
						break;
					case ']':
						c2--;
						if (sta.top() == '(') return "no";
						sta.pop();
						break;
					default:
						break;
				}
			}
			return (c1 == 0 && c2 == 0? "yes" : "no");
		}();
		cout << ans << endl;
	}
	return 0;
}

C++: #include <iostream>
#include<string>
#include<algorithm>
#include<stdio.h>
using namespace std;

int main() 
{
	string s;
	while(true)
	{
		getline(cin,s);
		if(s==".")return 0;
		string t;
		//int len=s.size();
	//	cout<<0<<endl;
		cout<<s<<endl;
		t=s;
		for(int i=0;i<s.size();i++)
		{
		//	cout<<0<<endl;
			if(s[i]=='(')
			{
				for(int j=s.size()-1;i<j;j--)
				{
					if(s[j]==')')
					{
						s.replace(i,1,"a");
						s.replace(j,1,"a");
						break;
					}
				}
			}
			if(s[i]=='[')
			{
				for(int j=s.size()-1;i<j;j--)
				{
					if(s[j]==']')
					{
						s.replace(i,1,"a");
						s.replace(j,1,"a");
						break;
					}
				}
			}
		}
		cout<<s<<endl;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]=='('||s[i]==')'||s[i]=='['||s[i]==']')
			{
				cout<<"no"<<endl;
				goto A;
			}
		}
		cout<<"yes"<<endl;
		A:;
		s.clear();
		t.clear();
	}
	return 0;
}

C++: #include<iostream>
#include<cstdio>

using namespace std;

int main(void){
  char r[202];
  int count = 101;
  char s;
  char c;
  int maru=0;
  int shikaku=0;
  while(true){
    //はじめの文字の判定
    scanf("%c",&s);
    if(s=='\n')scanf("%c",&s);
    if(s=='.')break;
    if(s=='('){
      r[count++]=')';
      maru++;
    }
    else if(s=='['){
      r[count++]=']';
      shikaku++;
    }
    else if(s==')'){
  	maru=-111;

    }
    else if(s==']'){
      shikaku=-111;
    }
    //終了条件ではないとき
    while(true){
      cin>>c;
      //    cout<<c;
      if(c=='.'||maru<0||shikaku<0)break;
      else if(c=='('){
	r[count++]=')';
	maru++;
      }
      else if(c=='['){
	r[count++]=']';
	shikaku++;
      }
      else if(c==')'){
	if(r[count-1]==c){
	  count--;
	  maru--;
	}
	else maru=-111;
      }
      else if(c==']'){
	if(r[count-1]==c){
	  count--;
	  shikaku--;
	}
	else shikaku=-111;
      }
    }
   if(c!='.'){
      while(true){
	cin>>c;
	//    cout<<c;
	if(c=='.')break;
      }
   }
   if(maru==0&&shikaku==0)cout<<"yes"<<endl;
   else cout<<"no"<<endl;
   maru=0;
   shikaku=0;
  }
  return 0;
}

C++: #include <bits/stdc++.h>

using namespace std;

#define MAX_LSIZE 100  // 一行の最大の長さ 
char buff[MAX_LSIZE+2];  // 一行の文字列を格納する配列     
// 行末の改行文字、NULL 文字も格納される 
char stack[MAX_LSIZE];  // スタック 
int sp;    // スタックポインタ 
 
int main() {   char c;  // 処理する文字を入れる変数   
    int match; // 括弧のバランス状況を表す   // 1 -> バランス,  0 -> 非バランス, -1 -> まだ不明   
    int i;   
    while(1){     
        fgets(buff, MAX_LSIZE+2, stdin); // 標準入力より配列 buff に１行読み込む     
        if(buff[0] == '.') break; // 先頭の文字が '.' なら終了     
        match = -1;  // バランス状況はまだ不明     
        sp = 0;   // stack pointer sp を初期化     
        for(i=0; ; i++){ // 文字列の先頭から順に１文字ずつ以下の処理を行う       
        c = buff[i];  // c = 処理対象の文字       
        switch(c){       
            case '(':       
            case '[':  
                    stack[sp++] = c; 
                    break;  // stack に 左括弧 を入れる       
            case ')': // stack が空か、 // stack から取り出した文字が '(' でなければバランスしていない  
                if(sp==0) match=0;  
                else if(stack[--sp] != '(') match = 0;  
                break;       
            case ']': // stack が空か、 // stack から取り出した文字が '[' でなければバランスしていない  
                if(sp==0) match=0;  
                else if(stack[--sp] != '[') match = 0;  
                break;       
            case '.': // stack が空ならバランス、そうでなければ非バランス  
                if(sp==0) match=1;  
                else match=0;       
            }       
            if(match != -1) break; // 結果が判明したので終了    
        } 
        if(match) printf("yes\n"); // 結果を出力     
        else printf("no\n");   
    } 
}