2013-09-06 3 views
0

질문이 있습니다.스택을 반복합니다.

괄호 안의 표현식을 처리하려면 stack을 사용하십시오. 열린 괄호를 보았을 때 그것이 보인 것을 주목하십시오. 여는 괄호 뒤에 닫는 괄호가 표시되면 pop 요소는 stack의 여는 괄호까지 포함됩니다. pushstack에 값을 입력하면 괄호로 묶은 표현식이 바뀌 었음을 나타냅니다.

어떻게 이런 일이 가능합니까? 이는 stack을 통해 반복해야합니다. 예를 들어, 스택 char들로 구성된 경우와 I 등 닫힌 괄호 참조 다른 용기에 각 단어와 push_front를 저장할 때까지 가기 오프

This is just (a test) to see. 

I 수 pop로 초기화가 다시 복사 stack으로 바꾸지 만 간접적으로 문제를 해결합니다. stack을 통해 반복하지 않고 문제에 어떻게 대답 할 수 있는지 이해하지 못하고 내 이해 stack에서 iterators 또는 subscript를 사용하지 않으므로 어떻게 가능합니까?

+0

일반 스택을 반복 할 수 없지만 스택을 벡터 나 문자열로 복사 한 다음 원하는 것을 수행 할 수는 있습니다. 운동의 목적;) –

+3

이 질문은 의미가 없습니다. – Ares

+1

Neil의 의견을 강조하고 진술/질문에 대해 글자 그대로 생각할 수도 있다고 덧붙입니다. 이것은 수학 표현식을 파싱하는 것과 관련이 있다고 가정합니다. 따라서 문자 배열 대신 스택의 연산자와 피연산자를 생각하면 도움이 될 것입니다. –

답변

1

정의에서 스택에 표시되는 유일한 요소는 스택의 맨 위입니다. 정식으로는 적어도 std::stack이이를 시행합니다. 실제로, 조금 더 깊게 보거나 심지어 반복 할 수있는 것이 종종 유용합니다. 이 경우에는 std::stack을 사용하지 마십시오. (std::vectorpush_back, pop_backback으로, 예를 들어, 아주 좋은 스택을한다.

또는 std::stack의 기본 데이터 멤버는, 개인되지 보호됩니다, 당신은 추가 회원을 모두 std::stack에서 상속하고 추가 할 수 있도록 .. 당신이 방법

+2

이것은 실제로 질문에 대답하지 않습니다. OP는 스택 작동 방식을 알고있는 것 같습니다. 실질적인 문제는 스택 측면에서 주어진 작업을 이해하는 것입니다. – zoska

1

아니, 나는 원래의 질문이 더 명확하게 될 수 있음을 동의하더라도 스택을 반복하도록 요구하지 않습니다 원래의 질문

는 다음의 예제 식을 보자 :
(8 (1 + 2))/5
= (8-3)/5
= 5/5
= 1

우리가 이것을 어떻게 달성 할 수 있습니까?
가장 왼쪽의 요소 (숫자, 연산자 또는 괄호)에서 읽기를 시작하여 스택으로 푸시합니다. 여는 괄호를 볼 때 괄호 _ 카운터를 증가시킵니다. 닫는 괄호를 볼 때 닫는 괄호를 스택으로 푸시하지 않고 스택에서 가장 최근의 여는 괄호까지 요소를 팝핑하기 시작하고 괄호 카운터를 줄입니다. 우리가 팝하는 항목은 다른 벡터 나 컨테이너에 괄호를 제외한 모든 항목을 저장하고 평가 한 다음 스택에 결과를 푸시합니다. 우리는 요소들을 계속해서 읽었습니다. 이 시점에서
(8- (1 + 2
, parenthesis_counter = 2, I는 스택에있는 모든 요소를 ​​밀어 가지고

그래서, 우리는 첫 번째 괄호를 읽을 때까지 상술 한 예에서, 우리가
이제는 닫는 괄호가 있습니다. 밀어 넣지 않습니다. 요소 '2', '+', '1'및 '('; 괄호를 1 씩 감소시키고 1 + 2를 계산합니다. 3을 반환합니다. 따라서 3을 스택에 넣습니다..이 시점에서

그래서, 지금 내가 가지고있는
(8-3

, parenthesis_counter = 1. 내가 요소의 나머지 부분을 읽어 계속

편집 : 있다는 점 유의 하시길 바랍니다 parenthesis_counter는 할 수 없다 이 솔루션을 사용하면 설명 상태를 돕기 만합니다.

+0

괄호 _ 카운터의 목적은 무엇입니까? 그것은 증가하고 감소하지만, 아무것도 그 값에 의존하는 것처럼 보이지 않습니다. –

+0

@PeteBecker, 네가 맞다. Parenthesis_counter는 솔루션과 아무 관련이 없습니다. 나는 그것을 설명하기 위해 사용했다. 주 솔루션에서 삭제할 수 있지만 나중에 상태를 설명하는 것이 명확하지 않을 수 있습니다. 대답에서 언급하겠습니다. 감사. – kaisernahid

+0

두 번째 생각에 괄호 카운터는 불법 표현을 탐지하는 데 도움이 될 수 있습니다 (여기서는 수행되지 않음). 운동의 질문에 "나는 열린 괄호를 보았을 때 그것을 보았습니다."라고 말했기 때문에 나는 그것을 처음부터 포함 시켰습니다. – kaisernahid