I want to input the value of p2 through the screen.
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
#include "Postfix.h"
class Postfix {
private:
char * expression;
int index = 0;
public:
Postfix(char * expression) : expression(expression) {}
void getPostfix()
{
Stack<char> stack;
stack.Push('#');
for (char x = NextToken(expression); x != NULL; x = NextToken(expression))
{
if (isOperand(x))
cout << x;
else if (x == ')')//(3*4)+9#
{
while (stack.Top() != '(')
{
cout << stack.Top();
stack.Pop();
}
if (!stack.IsEmpty()) stack.Pop();
}
else
{
for (; !stack.IsEmpty() && isp(stack.Top()) >= icp(x); stack.Pop())
cout << stack.Top();
stack.Push(x);
}
}
char x;
while ((x = stack.Top()) != '#')
{
cout << x;
stack.Pop();
}
cout << endl;
}
char NextToken(char* e)
{
char token = e[index];
index++;
return token;
}
bool isOperand(char x)
{
if (x == '+' || x == '-' || x == '*' || x == '/' ||
x == '(' || x == ')' || x == '%' || x == '#')
return false;
else
return true;
}
int isp(char a)
{
if (a == '(')
return 0;
else if (a == ')')
return 19;
else if (a == '+' || a == '-')
return 12;
else if (a == '*' || a == '%' || a == '/')
return 13;
else
return 0;
}
int icp(char a)
{
if (a == '(')
return 20;
else if (a == ')')
return 19;
else if (a == '+' || a == '-')
return 12;
else if (a == '*' || a == '%' || a == '/')
return 13;
else
return 0;
}
double Eval() {
}
};
void Eval(Expression e)
{
Stack<char> stack;
int i = 0;
for (char x = e[i]; x != NULL; x = e[++i]) {
if (!(x == '+' || x == '-' || x == '*' || x == '/' ||
x == '(' || x == ')' || x == '%' || x == '#'))
stack.Push(x);
// 숫자가 들어올시 스택에 저장
else {
cout << stack.Top();
stack.Pop(); // 연산자가 들어올 시 숫자를 출력, 스택에서 지움
if (!stack.IsEmpty()) { // 스택이 비어있지 않을 때
if (x == '#' || x == '+' || x == '-') { // 연산자가 +,-,#일 경우 스택에 저장되어있는 연산자를 모조리 출력하고 지움 (+,-의 기준으로 앞의 연산자을 모조리 출력한다고 생각)
while (!stack.IsEmpty()) {
cout << stack.Top();
stack.Pop();
}
}
else if ((stack.Top() == '*' || stack.Top() == '/')) { // 연산자가 *,/인데 스택의 top이 *,/이면 스택의 탑 출력 (우선순위가 같으므로 스택의 저장값을 먼저 출력)
cout << stack.Top();
stack.Pop();
}
}
if (x != '#') stack.Push(x); // 연산자 스택에 저장
//remove the correct number of operands for operator x from stack;
//perform the operation x and store the result onto the stack;
}
}
}
void stackTest1() {
Stack<int> s(2);
s.Push(3);
s.Push(2);
s.Push(1);
assert(s.Top() == 1);//3 2 1
s.Pop();//3 2
assert(s.Top() == 2);
assert(s.IsEmpty() != true);
s.Pop();
s.Pop();
assert(s.IsEmpty() == true);
s.Push(4);
s.Push(6);
assert(s.Top() == 6);
s.Pop();
assert(s.Top() == 4);
}
/*
//165페이지, Exercises 1의 (a) ~ (f)에 대하여 동작하게 debugging
index = 0;
Postfix("A/B-C+D*E-A*C");//화면에서 입력받는 것으로 수정
//Eval("2*4 + 5*7"); 구현
int end;
cin >> end;
}
//코딩 과제:
//페이지 166, 문제 3번과 4번: prefix and postfix을 만드는 문제
// 괄호() 사용시에도 처리하는 코딩으로 수정하는 것
*/
void main()
{
//stackTest1();
//Postfix p1("2+(3*4)+9#");//2
Postfix p1("(3*4)+9#");
p1.getPostfix(); //+
//165페이지, Exercises 1의 (a) ~ (f)에 대하여 동작하게 debugging
Postfix p2("A/B-C+D*E-A*C#"); //i want input!
p2.getPostfix();
Postfix p3("4*7+3-1#");
p3.getPostfix();
Eval("2*4 + 5*7#"); //끝을 나타내는 #입력
system("pause");
}
|
Last edited on
Last edited on