-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPostfixNotation1.cpp
80 lines (73 loc) · 2.7 KB
/
PostfixNotation1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "PostfixNotation1.h"
/// <summary>
/// 문제
/// 우리가 일반적으로 사용하는 계산방식은 중위표기법(Infix Notation)이라 하는데,
/// A + B와 같이 피연산자 'A'와 'B' 중간에 연산자 '+'가 위치하여 이렇게 불린다.
/// 컴퓨터공학에서는 후위표기법(Postfix Notation)을 많이 사용하는데,
/// 후위표기법은 A B + 와 같이 피연산자 'A'와 'B'의 뒤에 연산자 '+'가 위치한 표기법을 말한다.
///
/// 중위표기법에서(5 + 8) * 2 와 같은 수식은 '*'가 '+'보다 연산자 우선순위가 높으므로
/// 앞의 수식 에서처럼 5 + 8 을 먼저 계산해야한다면 괄호를 사용해야한다.
/// 하지만 수식(5 + 8) * 2 을 후위표기법으로 바꾸면 5 8 + 2 * 와 같이 되어,
/// 후위표기법은 괄호가 없이도 연산자의 우선 순위 를 명확히 할 수 있다는 장점이 있다.
/// 이런 이유로 소프트웨어로 구현되는 계산기들은 후위표기 법을 많이 사용한다.
///
/// 그럼 후위표기법의 수식을 입력 받아 계산하는 프로그램을 작성해 보자.
/// 0으로 나누는 경우는 주어지지 않는다.
///
/// 입력 형식
/// 입력의 첫 줄에는 총 입력되는 연산자와 피연산자의 개수의 합 M(3 ≤ M ≤ 11 )이 입력되며,
/// 그 다음 줄에 M개의 연산자와 피연산자가 한 칸씩의 공백 을 두고 입력된다.
/// 피연산자 X 는 0≤X≤9 의 범위를 가지는 정수이며,
/// 연산자는 사칙연산인 '*', '/', '+', '-'의 네 가지가 입력된다.
/// 0으로 나누는 경우는 입력되지 않는다.
///
/// 출력 형식
/// 피연산자나 연산자가 부족한 경우와 같이 완전하지 않은 수식은 입력되지 않는다.
/// 나눗셈 연산의 경우, 소수점 이하는 버리고 몫만 계산되며 정수로 나타난다. 예를 들어 10 3 / 은 3이 된다.
///
/// 입력 예 /// 입력 예 /// 입력 예
/// 3 /// 3 /// 5
/// 2 3 + /// 9 3 / /// 5 8 + 2 *
///
/// 출력 예 /// 출력 예 /// 출력 예
/// 5 /// 3 /// 26
///
/// http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=504&sca=2070
/// </summary>
void PostfixNotation1::Code()
{
int n;
std::cin >> n;
int* stack = new int[n] {};
int idx{ 0 };
char ch;
for (int i = 0; i < n; i++)
{
std::cin >> ch;
switch (ch)
{
case '+':
stack[idx - 2] += stack[idx - 1];
idx--;
break;
case '-':
stack[idx - 2] -= stack[idx - 1];
idx--;
break;
case '*':
stack[idx - 2] *= stack[idx - 1];
idx--;
break;
case '/':
stack[idx - 2] /= stack[idx - 1];
idx--;
break;
default:
stack[idx++] = ch - '0';
break;
}
}
std::cout << stack[0];
delete[] stack;
}