括弧ばかりからなる記号列が正しい形になっているかどうかを調べたい。括弧には、小括弧 ( )、中括弧 { }、大括弧 [ ] がある。それぞれの括弧は、その開き記号と閉じ記号とが対応していなければならない。正確にいうと、括弧ばかりからなる記号列が与えられとき、つぎの操作を可能な限り繰り返すことでその記号列が空となるならば、その記号列は正しいという。
( と ) がこの順に隣り合って並んでいるなら、共に取り除く。
{ と } がこの順に隣り合って並んでいるなら、共に取り除く。
[ と ] がこの順に隣り合って並んでいるなら、共に取り除く。
入力に与えられた括弧ばかりからなる記号列が正しいなら correct と1行に出力し、正しくなければ wrong と1行に出力するプログラムを作れ。
なお出力の末尾には改行を書き出すこと。
入力例1
({()[]}[{()()((()))}])({}[])
出力例1
correct
が問題です。
以前行ったコメントの数を出力するプログラムを参考にしてやってみたのですがコンパイルすらうまくいきません。どうしたらよいですか。教えていただきたいです。コードは以下です。2個目のコードが以前行ったコメント出力のものです。長くなってしまいすみません。
コード#include <stdio.h> typedef enum{ OUT, /*外*/ BRAC1, /*(*/ BRAC2, /*)*/ BRAC3, /*{*/ BRAC4, /*}*/ BRAC5, /*[*/ BRAC6, /*]*/ }state_t; int main(void){ state_t state=OUT; int ch; while((ch=getchar())!=EOF){ switch(state){ case OUT: if(ch=='('){ state=BRAC1; break; case BRAC1: if(ch==')'){ state=BRAC2; }else{ break; } }else if(ch=='{'){ state=BRAC3; break; case BRAC3: if(ch=='}'){ state=BRAC4; }else{ break; } }else if(ch=='['){ state=BRAC5; break; case BRAC3: if(ch==']'){ state=BRAC6; }else{ break; } } } } printf("true"); return 0; } #include <stdio.h> typedef enum { OUT, /* コメントの外 */ SLASH, /* コメントはじめの'/' */ IN, /* コメントの中 */ STAR, /* コメントおわりの'*' */ } state_t; int main(void) { int count = 0; state_t state = OUT; int ch; while ( (ch = getchar()) != EOF ) { switch ( state ) { case OUT: if ( ch == '/' ) state = SLASH; break; case SLASH: if ( ch == '*' ) state = IN; else if ( ch != '/' ) state = OUT; break; case IN: if ( ch == '*' ) state = STAR; break; case STAR: if ( ch == '/' ){state = OUT; count++; }else if ( ch != '*' )state = IN; break; } } printf("%d\n", count); /* 結果の出力 */ return 0; }
回答4件
あなたの回答
tips
プレビュー