본문 바로가기

Datastructure/[6] 스택

[6] 스택 ⑥ 스택의 응용 : 중위수식 변환

728x90
반응형

[ 문제 1 ] 스택을 이용하여 중위수식을 후위수식으로 변환하는 프로그램을 작성하시오

  • 스택은 배열이나 연결리스트로 구현함
  • 수식의 피연산자는 영문자(대문자)로 나타내고, 각 수식의 최대길이는 100으로 함
  • 수식은 아래 우선순위를 갖는 연산자들을 포함함 (숫자가 높을수록 우선순위가 높음)
입력토큰
연산자
우선순위
!+-
단항연산자
6
*
곱셈
5
/
나눗셈
5
+
덧셈
4
-
뺄셈
4
>
관계연산자
3
<
관계연산자
3
&&
논리연산자(AND)
2
||
논리연산자(OR)
1
  • 같은 우선순위를 갖는 연산자들은 왼쪽에서 오른쪽으로 계산하도록 함
  • 입출력에 대한 설명 (아래 입출력 예시 참조)

1) 첫 번째 라인 : 수식의 개수

2) 두 번째 라인 :

- 하나의 줄에 수식이 공백 없이 입력됨

입력 예시

문제 풀이

전역 변수push / pop 함수

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int top=-1, sign=0;

void push(char stack[],char data) {
	top++;
	stack[top] = data;
}

char pop(char stack[]) {
	char data= stack[top];
	top--;
	return data;
}

각 함수와 전역 변수의 역할은 다음과 같다.

 

  1. top: 스택의 최상위 원소의 인덱스를 나타내는 전역 변수.
  2. sign: 단항 연산자를 처리하기 위한 변수.

아래는 주요 함수들의 역할에 대한 설명이다.

 

  • push(char stack [], char data): 스택에 데이터를 삽입하는 함수입니다. 스택의 top을 증가시키고 데이터를 해당 인덱스에 저장한다.
  • pop(char stack []): 스택에서 데이터를 제거하고 반환하는 함수입니다. top에 위치한 데이터를 반환한 후 top을 감소시킨다.
push 스택의 top을 증가시키고 데이터를 해당 인덱스에 저장
pop top에 위치한 데이터를 반환한 후 top을 감소시킨다.

이 코드에서는 전역 변수를 사용하여 스택의 상태를 관리하고 있다.

 

이러한 방식은 코드의 간결함을 유지하는 데 도움이 되지만, 전역 변수의 사용은 프로그램의 가독성과 유지 보수성을 저하시킬 수 있다. 따라서 더 나은 방법은 스택을 사용하는 함수에 스택 자체를 전달하고 반환하는 것이다.

order 함수

int order(char str[], int i) { // 연산자 우선 순위 설정
    if ((top != i) && (i == 0) && ((str[i] == '+') || (str[i] == '-'))) {
        sign = 1;
        return 6;
        //단항 연산자가 다른 연산자보다 먼저 나오는 경우
    } 
    else if ((top != -1) && ((str[i] == '+') || (str[i] == '-')) &&
               ((str[i - 1] == '|') || (str[i - 1] == '&') || (str[i - 1] == '<') ||
                (str[i - 1] == '>') || (str[i - 1] == '-') || (str[i - 1] == '+') ||
                (str[i - 1] == '*') || (str[i - 1] == '/') || (str[i - 1] == '!'))) {
	return 6;
    } 
    else if (str[i] == '|')return 1; // 논리연산자(OR) - 1
    else if (str[i] == '&')return 2; // 논리연산자(AND) - 2
    else if ((str[i] == '>') || (str[i] == '<'))return 3; // 관계연산자 - 3
    else if ((str[i] == '+') || (str[i] == '-'))return 4; //더하기/빼기 연산자 - 4
    else if ((str[i] == '*') || (str[i] == '/'))return 5; //곱셈/나눗셈 연산자 - 5
    else if ((str[i] == '!'))return 6; // 단항 연산자 (부정) - 6
    elsereturn 0;
}

함수 order는 주어진 연산자의 우선순위를 설정하는 함수이다. 이 함수는 두 가지 주요 기능을 수행한다.

 

1. 연산자 우선순위 설정

 

- 각 연산자의 우선순위를 설정한다.

- 연산자에 따라 다른 우선순위가 지정되며, 우선순위는 숫자가 낮을수록 높습니다.

 

2. 단항 연산자 처리

 

⸰ 특정 조건에 따라 단항 연산자를 처리하고 우선순위를 반환한다.

 아래는 함수의 주요 부분에 대한 설명이다.

 

  • 연산자 우선순위 설정 부분
    • 조건문을 사용하여 각 연산자에 따라 다른 우선순위를 설정합니다.
    • |, &, >, < 등의 논리 및 관계 연산자는 우선순위가 높은 숫자로 설정됩니다.
    • +, **, **, / 등의 산술 연산자는 각각 다른 우선순위가 설정됩니다.
  • 단항 연산자 처리 부분:
    • (top!= i) && (i == 0) && ((str [i] == '+') || (str [i] == '-')) 조건은 단항 연산자가 수식의 첫 번째 위치에 나타날 때를 처리합니다. 이 경우 단항 연산자의 우선순위를 설정하고 sign 변수를 설정하여 다음 연산자가 단항 연산자임을 나타냅니다.
    • ((top!= -1) && ((str [i] == '+') || (str [i] == '-')) &&...) 조건은 단항 연산자가 다른 연산자 뒤에 나타날 때를 처리합니다. 스택에 이미 연산자가 있는 상황에서 단항 연산자가 등장하는 경우를 처리하고, 단항 연산자의 우선순위를 반환합니다.

추가적인 설명

if ((top != i) && (i == 0) && ((str[i] == '+') || (str[i] == '-'))) {
        sign = 1;
        return 6;
        //단항 연산자가 다른 연산자보다 먼저 나오는 경우
} 
else if ((top != -1) && ((str[i] == '+') || (str[i] == '-')) &&
       ((str[i - 1] == '|') || (str[i - 1] == '&') || (str[i - 1] == '<') ||
       (str[i - 1] == '>') || (str[i - 1] == '-') || (str[i - 1] == '+') ||
       (str[i - 1] == '*') || (str[i - 1] == '/') || (str[i - 1] == '!'))) {
return 6;
}

 

이 코드 블록은 주어진 수식에서 단항 연산자를 처리하는 부분이다.

 

단항 연산자는 우선순위가 가장 높아야 한다.

이 코드는 단항 연산자를 올바르게 처리하기 위해 두 가지 상황을 고려한다.

 

1. 단항 연산자가 첫 번째로 나오는 경우

 

수식의 첫 번째 위치에 단항 연산자가 있는지 확인하고, 있을 경우 해당 연산자의 우선순위를 반환한다.

이때 sign 변수를 1로 설정하여 다음 연산자가 단항 연산자임을 나타낸다.

 

sign 변수 : 다음 연산자가 단항 연산자인지 확인하기 위한 변수.
(단항 연산자 입력 된 경우, sign == 1)

 

if ((top != i) && (i == 0) && ((str[i] == '+') || (str[i] == '-'))) {
        sign = 1;
        return 6;
        //단항 연산자가 다른 연산자보다 먼저 나오는 경우

(top!= i) && (i == 0) 조건은 단항 연산자가 수식의 첫 번째 위치에 나타날 때를 확인하기 위한 조건이다.

 

  • top != i: 스택의 top 인덱스와 현재 처리 중인 수식의 인덱스 i가 같지 않을 때를 의미합니다. 이는 현재 스택에 아무런 연산자가 쌓여있지 않은 경우를 나타냅니다. 즉, 수식의 첫 번째 연산자를 처리하고 있는 상태이다.
  • i == 0: 현재 처리 중인 수식의 인덱스가 0일 때를 의미한다. 이는 수식의 시작 부분에 있는 연산자를 나타낸다.

따라서 (top != i) && (i == 0) 조건은 스택에 아무런 연산자가 쌓여있지 않은 상태에서 수식의 첫 번째 위치에 있는 연산자를 처리하는 경우를 판별한다. 이 조건이 참이면 해당 연산자는 단항 연산자로 처리된다.

 

→ 정리하면, 입력된 문자열에서 첫 번째 문자가 top이 아닌 경우를 말한다.

→ 스택이 비어있다면 top의 값은 -1로, 양수의 범위인(0~strlen(str)) i가 될 수 없다.

→ 따라서 해당 조건은 스택에 스택에 저장된 데이터가 없고, 수식의 첫 번째 위치의 연산자를 처리하는 경우이다.


단항 연산자는 이항 연산자와 달리 피연산자 하나만을 대상으로 하는 연산자이다. 따라서 단항 연산자는 피연산자의 왼쪽에 위치할 때와 오른쪽에 위치할 때의 의미가 다를 수 있다.

 

예를 들어, 단항 덧셈 연산자 '+'는 피연산자를 양수로 만들지만, 단항 부정 연산자 '-'는 피연산자의 부호를 반전시킨다.

따라서 수식에서 단항 연산자가 처음으로 나타날 때는 해당 연산자가 피연산자의 왼쪽에 위치할 것으로 예상되는 경우다. 이 경우에는 해당 연산자가 단항 연산자로 해석될 가능성이 높다.

 

⭐️⭐️⭐️중요⭐️⭐️⭐️

 

그러나 수식의 중간에 나타날 때는 해당 연산자가 단항 연산자인지 이항 연산자인지를 결정하기 위해 추가적인 정보가 필요하다. 따라서 단항 연산자가 처음으로 나타날 때 이를 확인하여 적절한 우선순위를 부여하고 올바르게 해석하는 것이 중요하다.

 

예를 들어 단항 연산자가 ++와 --로 들어올 때, 다른 단항 연산자와 같은지 확인하기 위해서 확인 값이 + 혹은 -일 때 뒤의 연산자가 단항 연산자 + 혹은 -인지 확인해야 한다. 이를 위해 sign 변수를 사용한다.

 

 

2. 단항 연산자가 다른 연산자 뒤에 나오는 경우

 

이미 스택에 연산자가 존재하는 상황에서 단항 연산자가 등장하는 경우의 처리이다.

이때 스택의 top에 있는 연산자와 현재 연산자를 비교하여 단항 연산자임을 판별하고, 단항 연산자인 경우 우선순위를 반환한다.

 

else if ((top != -1) && ((str[i] == '+') || (str[i] == '-')) &&
               ((str[i - 1] == '|') || (str[i - 1] == '&') || (str[i - 1] == '<') ||
                (str[i - 1] == '>') || (str[i - 1] == '-') || (str[i - 1] == '+') ||
                (str[i - 1] == '*') || (str[i - 1] == '/') || (str[i - 1] == '!'))) {
        return 6;
}

위 코드 블록은 단항 연산자가 다른 연산자 뒤에 나타날 때의 상황을 처리하는 부분이다.

 

이 조건문은 현재 처리 중인 연산자 str [i]가 '+' 또는 '-'인 경우를 확인하고, 바로 직전에 처리한 연산자 str [i - 1]가 논리연산자, 관계연산자, 산술연산자, 또는 다른 단항 연산자인지를 확인한다.

  • (top!= -1): 스택이 비어있지 않은지 확인한다. 이 조건은 현재 스택에 연산자가 존재하는지를 판단하기 위함이다.
  • ((str [i] == '+') || (str [i] == '-')): 현재 처리 중인 연산자가 '+' 또는 '-'인지를 확인한다. 단항 연산자인지를 판단하기 위함이다.
  • ((str [i - 1] == '|') || (str[i - 1] == '&') ||... (str [i - 1] == '!')): 바로 직전에 처리한 연산자가 논리연산자, 관계연산자, 산술연산자, 또는 다른 단항 연산자인지를 확인한다. 이는 단항 연산자가 다른 연산자 뒤에 나타날 경우를 처리하기 위한 조건이다.

따라서 위 조건문은 현재 연산자가 단항 연산자이고, 바로 직전에 처리한 연산자논리연산자, 관계연산자, 산술연산자, 또는 다른 단항 연산자일 때 단항 연산자의 우선순위를 반환한다.

 

trans 함수

void trans(char *str) {
    char stack[101] = {NULL};

    for (int i = 0; i < strlen(str); i++) {
        if (str[i] == '(') push(stack, str[i]);
        
		else if (str[i] == ')') {
            while (stack[top] != '(') printf("%c", pop(stack));
            pop(stack);
        } 
		
		else if (order(str, i) == 6) push(stack, str[i]); //단항 연산자인 경우
        else if (order(str, i) == 0) printf("%c", str[i]); // 피연산자인 경우 바로 출력
        
		else {
            if (sign == 1) printf("%c", pop(stack));// 바로 이전에 처리한 연산자가 단항 연산자인 경우이다. 따라서 스택에 있는 이전 연산자를 출력
            else
                while ((top != -1) && (order(str, i) <= order(stack, top))) printf("%c", pop(stack));
			if ((order(str, i) == 1) || (order(str, i) == 2)) {
				//현재 처리 중인 연산자가 논리 연산자 (OR 또는 AND)인 경우입니다.
                push(stack, str[i]);
                i++;
            }
            push(stack, str[i]);
			//위의 조건문이 아닌 경우는 산술 연산자나 관계 연산자인 경우입니다. 이 경우에는 스택에 현재 연산자를 푸시합니다.
        }
    }

    while (top != -1) printf("%c", pop(stack));

    printf("\n");
}

위의 trans 함수는 중위 표기법으로 표현된 수식을 후위 표기법으로 변환하는 역할을 한다.

 

함수 내부에서는 주어진 수식을 한 문자씩 읽어가며 처리한다. 각 문자에 대해 다음과 같은 작업을 수행한다.

 

  1. '(' 이면 스택에 푸시합니다.
  2. ')' 이면 '('가 나올 때까지 스택에서 팝 하고 출력합니다.
  3. 단항 연산자인 경우 스택에 푸시합니다.
  4. 피연산자인 경우 출력합니다.
  5. 연산자인 경우 스택의 top과 비교하여 출력 또는 스택에 푸시합니다.

위의 코드에서 order 함수는 이미 설명되었습니다. 여기서는 해당 함수를 사용하여 연산자의 우선순위를 비교하고, 이에 따라 스택에 연산자를 푸시하거나 출력합니다. sign 변수는 단항 연산자를 처리하는 데 사용되며, pushpop 함수는 스택을 조작합니다.

마지막으로, 모든 문자를 처리한 후에는 스택에 남아있는 모든 연산자를 출력합니다.


추가적인 설명

if (str[i] == '(') push(stack, str[i]);
else if (str[i] == ')') {
	while (stack[top] != '(') printf("%c", pop(stack));
	pop(stack);
}
        
else if (order(str, i) == 6)
	push(stack, str[i]); //단항 연산자인 경우
else if (order(str, i) == 0)
	printf("%c", str[i]); // 피연산자인 경우 바로 출력

 

첫 번째 if 문에서는 현재 문자가 '('인 경우 스택에 그대로 푸시합니다.

두 번째 else if 문에서는 현재 문자가 ')'인 경우, 스택에서 '('가 나올 때까지 스택의 요소들을 모두 팝 하고 출력합니다.

세 번째 else if 문에서는 현재 문자가 단항 연산자인 경우 스택에 푸시합니다.

네 번째 else if 문에서는 현재 문자가 피연산자인 경우 바로 출력합니다.

 

//생략
if (sign == 1) printf("%c", pop(stack));// 바로 이전에 처리한 연산자가 단항 연산자인 경우이다. 따라서 스택에 있는 이전 연산자를 출력
else
	while ((top != -1) && (order(str, i) <= order(stack, top))) printf("%c", pop(stack));
				
if ((order(str, i) == 1) || (order(str, i) == 2)) {
	push(stack, str[i]);
	i++;
}
push(stack, str[i]);
//생략

위 코드 부분은 연산자의 우선순위를 비교하여 스택에 연산자를 푸시하거나 출력하는 부분이다.

 

각각의 조건에 대한 설명은 아래와 같다.

 

[1]-1. if (sign == 1)

 

sign 변수가 1인 경우는 바로 이전에 처리한 연산자가 단항 연산자인 경우이다. 따라서 스택에 있는 이전 연산자를 출력한다.

 

[1]-2. else while ((top!= -1) && (order(ar, i) <= order(stack, top)))

 

 단항 연산자가 아닌 경우, 현재 연산자와 스택의 top에 있는 연산자의 우선순위를 비교한다.

 스택의 top에 있는 연산자가 현재 연산자보다 우선순위가 높거나 같을 때까지 스택에서 연산자를 팝 하고 출력합니다.

 

[2]. if ((order(ar, i) == 1) || (order(ar, i) == 2))

 

 현재 처리 중인 연산자가 논리 연산자 (OR 또는 AND)인 경우이다.

 이 경우에는 현재 연산자의 우선순위가 더 높기 때문에 스택에 바로 푸시한다.

 현재 연산자 다음에 바로 연속된 연산자가 오는 경우를 고려하여 i를 증가시켜서 해당 연산자를 건너뛰도록 한다.

 

마지막으로, 위의 조건문이 아닌 경우는 산술 연산자나 관계 연산자인 경우이다. 이 경우에는 스택에 현재 연산자를 푸시한다.

이렇게 함으로써 수식의 각 연산자를 올바른 순서로 스택에 푸시하거나 출력하여 후위 표기법으로 수식을 변환한다.

예시 분석

A*B+C+(D+E)*F

함수의 실행과정은 [더 보기]란의 접은 글을 확인한다.

더보기

1. A 출력

2. * → 스택에 저장

 첫 번째 연산자이므로 바로 스택에 저장

3. B 출력

4. + → 스택

 * : 스택에서 출력

 + : 스택 저장

5. C 출력

6. + → 스택

 (4) 번에서 스택에 저장된 연산자와 동일한 연산 순위

 (4) 번의 스택에 저장된 연산자 + 출력

+ : 스택에 저장

7. (  (괄호) → 스택에 저장

8 . D 출력

9. + → 스택

 + : 스택에 저장

10. E 출력

11. ) (괄호)

 ( (괄호)가 아닐 때까지 스택의 연산자를 출력

 ( (괄호)를 pop을 통해 날림

12. * → 스택에 저장

13. F 출력

14. 스택에 남은 모든 연산자 출력

A/B-C+D*E-F*G

함수의 실행과정은 [더 보기] 란의 접은 글을 확인한다.

더보기

1. A 출력

2. / → 스택에 저장

3. B 출력

4. - → 스택

 / 연산자가 더 우선순위가 높음

 / 연산자 출력(pop)

 - 연산자 저장

5. C 출력

6. + → 스택

 스택에 저장된 - 연산자와 우선 순위가 같음

 - 연산자 출력 (pop)

 + 연산자 스택에 저장

6. D 출력

7. * → 스택

 스택에 저장된 + 연산자보다 우선순위가 높음

 스택에 * 연산자 저장

8. E 출력

9. → 스택

 스택에 저장된 *가 - 연산자보다 우선 순위가 더 높음

 * 연산자 출력

 스택에 저장된 + 연산자와 - 연산자가 우선순위가 동일

 + 연산자 출력

 - 연산자 저장

10. F 출력

11. * → 스택

 * 연산자가 - 연산자보다 우선순위가 높음

 * 연산자 스택에 저장

12. G 출력

13. 남은 연산자 출력

 

AB/C-DE*+FG*-

 

출력 결과 :

AB/C-DE*+FG*-

A+(B*C+D)*E

함수의 실행과정은 [더 보기]란의 접은 글을 확인한다.

더보기

1. A 출력

2. + → 스택에 저장

3. ( → 스택에 저장

4. B 출력

5. * → 스택

스택에 저장된 + 연산자보다 우선순위가 높음

스택에 * 연산자 저장

6. C 출력

7.  + → 스택

 스택 top의  연산자인 *가 우선순위가 더 높음

 * 연산자 출력

 스택 top의  연산자인 ( 는 우선순위가 0 임

 + 연산자가 ( 연산자보다 우선순위가 큼

 + 연산자 저장

8. D 출력

9. ) → 스택

☑ )가 나올 때까지 스택에 저장된 연산자 모두 출력

☑ )를 pop 하여 버림

10. * → 스택

☑ * 연산자가 top에 저장된 + 연산자 보다 우선순위가 높음

* 연산자를 스택에 저장

11. E 출력

12. 남은 연산자를 모두 출력

 

출력 결과 : ABC*D+E*+

ABC*D+E*+

A&&B||C||!(E> F)

함수의 실행과정은 [더 보기] 란의 접은 글을 확인한다.

더보기

1. A 출력

2. & → 스택 (1)

☑ &&은 논리 연산자

&를 스택에 저장

3. & → 스택 (2)

 &를 스택에 저장

4. B 출력

5. | → 스택 (1)

스택의 맨 위에 저장된 첫 번째 & 연산자

☑ 스택의 top에 저장된 & 연산자가 더 우선순위가 높음

☑ & 연산자 출력 (pop)

스택의 맨 위에 저장된 두 번째 & 연산자

☑ 스택의 top에 저장된 & 연산자가 더 우선순위가 높음

☑ & 연산자 출력 (pop)

☑ ||은 논리 연산자

|를 스택에 저장

6. | → 스택 (2)

☑ ||은 논리 연산자

 |를 스택에 저장

7. C 출력

8. | → 스택 (1)

☑ 입력된 연산자 |는 top의 연산자 |와 우선 순위가 같음

 스택의 맨 위에 저장된 첫 번째 | 연산자

☑ 스택의 top에 저장된 | 연산자와 우선순위가 동일

☑ | 연산자 출력 (pop)

 스택의 맨 위에 저장된 두 번째 | 연산자

☑ 스택의 top에 저장된 & 연산자와 우선순위가 동일

| 연산자 출력 (pop)

9. | → 스택 (2)

 |를 스택에 저장

10. ) → 스택에 저장

11. E 출력

12. > → 스택

 스택 top의  연산자인 ( 는 우선 순위가 0 임

> 연산자가 ( 연산자보다 우선순위가 큼

> 연산자 저장

13. F 출력

14. ) → 스택

☑ )가 나올 때까지 스택에 저장된 연산자 모두 출력

☑ )를 pop 하여 버림

 

출력 결과 : AB&&C||EF>!||

AB&&C||EF>!||
 

정답 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int top=-1, sign=0;

void push(char stack[],char data) {
	top++;
	stack[top] = data;
}

char pop(char stack[]) {
	char data= stack[top];
	top--;
	return data;
}

int order(char str[],int i) { // 연산자 우선 순위 설정
	if ((top != i) && (i == 0) && ((str[i] == '+') || (str[i] == '-'))) {
		sign = 1;
		return 6;
		//단항 연산자가 다른 연산자보다 먼저 나오는 경우
	}
	else if ((top != -1) && (  (str[i] == '+') || (str[i] == '-')  ) &&
		(  (str[i - 1] == '|') || (str[i - 1] == '&') || (str[i - 1] == '<') ||
		   (str[i - 1] == '>') || (str[i - 1] == '-') || (str[i - 1] == '+') ||
		   (str[i - 1] == '*') || (str[i - 1] == '/') || (str[i - 1] == '!')  )   ){
		return 6;
    }

	else if (str[i] == '|') return 1; // 논리연산자(OR) - 1
	else if (str[i] == '&') return 2; // 논리연산자(AND) - 2
	else if ((str[i] == '>')||(str[i]=='<')) return 3; // 관계연산자 - 3
	else if ((str[i] == '+') || (str[i] == '-')) return 4; //더하기/빼기 연산자 - 4
	else if ((str[i] == '*') || (str[i] == '/')) return 5; //곱셈/나눗셈 연산자 - 5
	else if ((str[i] == '!')) return 6; // 단항 연산자 (부정) - 6
	else return 0;
}

void trans(char *str) {
	char stack[101] = {NULL};

	for (int i = 0; i < strlen(str); i++) {
		if (str[i] == '(') {
			push(stack, str[i]);
		}
		else if (str[i] == ')') {
			while (stack[top] != '(') printf("%c", pop(stack));
			pop(stack);
		}

		else if (order(str,i) == 6) push(stack, str[i]);//단항 연산자인 경우
		
		else if (order(str, i) == 0) printf("%c", str[i]);// 피연산자인 경우 바로 출력
		else {
			if (sign == 1) printf("%c", pop(stack)); 
			else while ((top != -1) && (order(str, i) <= order(stack, top))) printf("%c", pop(stack));
			if ((order(str, i) == 1) || (order(str, i) == 2)) {
				push(stack, str[i]);
				i++;
			}
			push(stack, ar[i]);
		}
	}

	while (top != -1)  printf("%c", pop(stack));
	
	printf("\n");
}

int main(){
	int n; // 수식의 개수 변수
	scanf("%d", &n);getchar(); // 수식의 개수 입력받음

	for (int i = 0; i < n; i++) { // 수식의 개수만큼 반복
		char str[101] = { NULL }; // 임의의 문자열 선언

		top = -1;sign = 0; //스택에 필요한 변수를 선언 및 초기화

		gets(str);//문자열 입력받기
		trans(str);//변환하기
	}
	return 0;
}

/*
5
A*B+C+(D+E)*F
A+B*C
A/B-C+D*E-F*G
A+(B*C+D)*E
A&&B||C||!(E>F)
*/
728x90
반응형
댓글