2011-12-04 15 views
-1

スタックを使用して適切なネストを行うために、ブラケットからなるユーザー入力を検証するプログラムを作成しようとしています。私はSTLコンテナや再帰を使用せずにこれを実行しようとしています。私はロードブロックに多少ヒットしましたが、正しい方向に向かってちょっとしたナッジを探しています。私は一種の近くだと思うが、私はここに(私は自己教育を通じて学習の過程にいるよ)C++スタック付きブラケットバリデータ

それをoversimplifyingすることができるような気が私がこれまで持っているものです。

#include <iostream> 
#include <string> 
#include "ArrayStack.h" 
using namespace std; 

bool test(char *argg); 

int main() 
{ 
    string input; 
    int size = 50; 

    cout << "enter here: "; 
    getline(cin, input); 
    for (int i = 0; i < size; i++) 
     test(input[i]); 
} 

bool test(char *argg) 
{ 
    ArrayStack S; 
    char D; 
    while (*argg) { 
     switch(*argg) { 

      case '[': case '{': case '(': 
       S.push(*argg); 
       break; 

      case ']': 
       if(S.isEmpty()) 
        return false; 
       D = S.pop(); 
       if(D!='[') 
        return false; 
       break; 

      case '}': 
       if(S.isEmpty()) 
        return false; 
       D = S.pop(); 
       if(D!='{') 
        return false; 
       break; 

      case ')': 
       if(S.isEmpty()) 
        return false; 
       D = S.pop(); 
       if(D!='(') 
        return false; 
       break; 

      default: 
       return false; 
     }// end switch 
        argg++; 
    }// end while 

    return S.isEmpty(); // return true if reach here with empty stack 

} 

感謝事前にどのような援助のために

+3

なぜあなたの問題が何であるかを言わないのですか(コードがコンパイルされていないようです)。とにかく、少なくとも2人は今日/先日同じ宿題について尋ねてきたので、それらの答えを見てください。一般的な観察: 'main'の前に関数を宣言し、それを定義するのではなく、' main'より前に定義するのはどうですか? –

+1

私はこれらの質問のうち2つが最後の数時間でポップアップしているのを見て誓うことができましたが、私はそれらを見つけることができませんでした... – Xeo

+0

ええ、彼は以前に同じ質問をしましたhttp://stackoverflow.com/questions/8373159/chars-to-check-balanced-bracketsのスタック – Drahakar

答えて

0

どちらかといえば、あなたが必要とするすべてである必要があり、それを

char inverse(char c){ 
    if(c==']') return '['; 
    if(c=='}') return '{'; 
    if(c==')') return '('; 
    return c; 
} 
int stillvalid(char c, ArrayStack &stack){ 
    if(strchr("[{(", c)) 
     stack.push(c); 
    else if(strchr("]})", c)) 
     if(stack.isEmpty() || inverse(c) != stack.pop()) 
      return 0; 
    return 1; 
} 

int main(){ 
    int c; 
    ArrayStack stack; 
    while((c=getchar())!=EOF){ 
     if(!stillvalid((char)c, stack)){ 
      printf("bad\n"); 
      exit(0); 
     } 
    } 
    printf("good\n"); 
    return 0; 
} 

を過度に複雑です。

+0

それは文字列 "a"が与えられていないので間違っていて、ArrayStackはおそらくリファレンス –

+0

によって渡されるべきですが、strchrとは何かのユーザー入力をプルしませんか? – ag9023

+0

スタックを参照渡しするのが正しいかどうかは、変更します。 Strchrは、文字列内の文字の最初のインスタンスへのポインタを返します。存在しない場合はnullを返します – Dave

0

入力と手で自分のコードをトレースmyfunc(42);

、何が起こるか文字によって文字を守ってください。それはあなたのエラーを指摘する必要があります。