2011-12-04 2 views
-1

스택을 사용하여 적절한 중첩을 위해 대괄호로 구성된 사용자 입력의 유효성을 검사하는 프로그램을 작성하려고합니다. STL 컨테이너 또는 재귀를 사용하지 않고이 작업을 수행하려고합니다. 나는 도로 블록을 약간 공격했고, 나는 올바른 방향으로 조금 움직였다.C++ 스택이있는 브래킷 검사기

#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

왜 문제가 무엇인지 알지 못합니까? (코드가 컴파일되지 않는 것 같습니다) 어쨌든, 적어도 두 명의 다른 사람들이 오늘/어제 같은 숙제에 대해 물었습니다. 따라서 그 대답을보십시오. 일반적인 관찰 :'main' 전에 함수를 선언하고 그것을 정의하는 대신'main' 전에 정의하지 않는 이유는 무엇입니까? –

+1

나는 지난 몇 시간 동안이 질문 중 두 가지가 튀어 나오는 것을 보았다고 맹세 할 수는 있지만, 나는 그들을 찾을 수없는 것 같아. – Xeo

+0

그는 이전에 같은 질문을 한 적이있다. http://stackoverflow.com/questions/8373159/stack-of-chars-of-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; 
} 

을과 복잡함을하고 있습니다. 문자로 myfunc(42);

무슨 일 관찰 입력, 문자로 손으로 당신의 코드를 통해

+0

그게 잘못 주어진 문자열 "a", 그리고 ArrayStack 참조로 전달되어야합니다 –

+0

은 어떤 사용자 입력을 당겨하지 않는 ... strchr 무엇입니까? – ag9023

+0

스택을 참조로 전달하는 것에 대해 수정했습니다.이를 변경하겠습니다. Strchr은 문자열에있는 문자의 첫 번째 인스턴스에 대한 포인터를 반환하고, 존재하지 않으면 null을 반환합니다. – Dave

0

추적. 그것은 당신에게 당신의 잘못을 지적해야합니다.