π1. λ¬Έμ

π2. μμ€μ½λ + μ£Όμ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
int err = 0;
typedef char element;
typedef struct {
element data[MAX_STACK_SIZE];
int top;
} StackType;
//μ΄κΈ°ν ν¨μ
void init_stack(StackType *s)
{
s->top = -1;
}
//곡백 μν κ²μΆ ν¨μ
int is_empty(StackType *s)
{
return (s->top == -1);
}
//ν¬ν μν κ²μΆ ν¨μ
int is_full(StackType *s)
{
return (s->top == (MAX_STACK_SIZE - 1));
}
//μ½μ
ν¨μ
void push(StackType *s, element item)
{
if (is_full(s)) {
fprintf(stderr, "μ€ν ν¬ν μλ¬\n");
return;
}
else s->data[++(s->top)] = item;
}
//μμ ν¨μ
element pop(StackType *s)
{ if (is_empty(s)) {
fprintf(stderr, "μ€ν 곡백 μλ¬\n");
exit(1);
}
else return s->data[(s->top)--];
}
//νΌν¬ ν¨μ
element peek(StackType *s)
{
if (is_empty(s)) {
fprintf(stderr, "μ€ν 곡백 μλ¬\n");
exit(1);
}
else return s->data[s->top];
}
//νμ νκΈ° μμ κ³μ° ν¨μ
int eval(char exp[])
{
int op1, op2, value, i = 0;
int len = strlen(exp);
char ch;
StackType s;
init_stack(&s); //μ€νμ΄κΈ°ν ( μμ±)
for (i = 0; i < len; i++) {
ch = exp[i];
if (ch != '+' && ch != '-' && ch != '*' && ch != '/') {
value = ch - '0';//μ
λ ₯μ΄ νΌμ°μ°μμ΄λ©΄
push(&s, value);
}
else { //μ°μ°μμ΄λ©΄ νΌμ°μ°μλ₯Ό μ€νμμ μ κ±°
op2 = pop(&s);
op1 = pop(&s);
switch (ch) { //μ°μ°μ μννκ³ μ€νμ μ μ₯
case '+': push(&s, op1 + op2); break;
case '-': push(&s, op1 - op2); break;
case '*': push(&s, op1 * op2); break;
case '/': push(&s, op1 / op2); break;
}
}
}
return pop(&s);
}
//μ°μ°μμ μ°μ μμλ₯Ό λ°ννλ€.
int prec(char op)
{ switch (op) {
case '(': case ')': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
}
return -1;
}
void check_error(element exp[]) {
err = -1;
int len = strlen(exp);
//μ€λ₯ 0 : μ°μ°μν 0μ΄ μ€λ©΄ μμΈμ²λ¦¬
for (int i = 0; i < len; i++) {
if (i + 1 < len && exp[i] == '/' && exp[i + 1] == '0') {
printf("κ³μ°κ²°κ³Ό : ");
printf("μ€λ₯ : 0μΌλ‘ λλ μ μμ΅λλ€.\n\n");
err = 0;
break;
}
}
int count = 0;
//μ€λ₯ 1 : κ΄νΈμ μ§μ΄ λ§μ§ μμΌλ©΄ μμΈμ²λ¦¬
for (int i = 0; i < len; i++) {
if (exp[i] == '(') {
count++;
}
else if (exp[i] == ')') {
count--;
}
}
if (count > 0) {
printf("κ³μ° κ²°κ³Ό\n");
printf("μ€λ₯1: κ΄νΈ λ§€μΉ λΆκ°λ₯\n\n");
err = 1;
}
else if (count < 0) {
printf("κ³μ° κ²°κ³Ό\n");
printf("μ€λ₯1: κ΄νΈ λ§€μΉ λΆκ°λ₯2\n\n");
err = 1;
}
//μ€λ₯ 2 : μμΈ λ¬Έμ ν¬ν¨
for (int i = 0; i < len; i++) {
if (exp[i] == '(' || exp[i] == ')') {
continue;
}
else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
continue;
}
else if ('0' <= exp[i] && exp[i] <= '9') {
continue;
}
else {
printf("κ³μ°κ²°κ³Ό\n");
printf("μ€λ₯2: μμΈ λ¬Έμ ν¬ν¨\n\n");
err = 2;
}
}
//νμ리 μ μ΄μμ μ μ
λ ₯μ λν΄ μμΈμ²λ¦¬
int count_len = 0;
int max_len = 0;
for (int i = 0; i < len; i++){
if ('0' <= exp[i] && exp[i] <= '9') {
count_len++;
if (count_len >= max_len) {
max_len = count_len;
}
}
else { count_len = 0;
}
}
if (max_len >= 2) {
printf("κ³μ°κ²°κ³Ό\n");
printf("μ€λ₯ 3: ν μ리μ μ΄μμ μ
λ ₯ ν¬ν¨\n\n");
err = 3;
}
}
//μμ λ³ν ν¨μ
element* infix_to_postfix(element exp[]) {
//μ
λ ₯λ°μ νκΈ°μ μ€λ₯ κ²μ¬
check_error(exp);
//μ€λ₯κ° μλ€λ©΄ λ€μ μ€ν
if (err != -1) {
return NULL;
}
int i, idx = 0; //iλ forλ¬Έ μ μ΄ λ³μ ,idx λ post_arrμ inded
int len = strlen(exp);
char ch, op;
StackType s;
element* postfix_arr = (element*)malloc(MAX_STACK_SIZE);
if (postfix_arr == NULL) {
fprintf(stderr, "λ©λͺ¨λ¦¬ ν λΉ μλ¬\n");
exit(1);
}
init_stack(&s); //μ€ν μ΄κΈ°ν
// μ€μ νκΈ°μμΌλ‘ ννλ μμ μν
for (int i = 0; i < len; i++) {
// κ°μ λ½λλ€
ch = exp[i];
//μΌλ° μ«μλΌλ©΄ κ·Έλλ postfix_arrμ μΆκ°
if ('0' <= ch && ch <= '9') {
postfix_arr[idx++] = ch;
}
//μ°μ°μ +,-,/λΌλ©΄
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!is_empty(&s) && (prec(ch) <= prec(peek(&s))))
{
//ν΄λΉ κ°λ€μ λͺ¨λ μΆκ°ν΄ μ€λ€.
postfix_arr[idx++] = peek(&s);
pop(&s);
}
//μκΈ° μμ μ μ€νμ μΆκ°νλ€.
push(&s, ch);
}
//'('λ 무쑰건 μ€νμ μΆκ°νλ€.
else if (ch == '(') {
push(&s, ch);
}
//')'κ° λμ€λ©΄ '('κ° λμ¬λκΉμ§ μ€νμμ popνμ¬ μΆκ°ν΄μ€λ€.
else if (ch == ')') {
op = pop(&s);
while (op != '(')
{
postfix_arr[idx++] = op;
op = pop(&s);
}
}
}
//μμ§ μ€νμ λ¨μμλ κ°λ€μ λͺ¨λ μΆκ°ν΄μ€λ€.
while (!is_empty(&s))
{
op = peek(&s);
pop(&s);
postfix_arr[idx++] = op;
}
// λ¬Έμμ΄μ λμ μ§μ ν΄μ€λ€.
postfix_arr[idx] = '\0';
return postfix_arr;
}
int main(void) {
element expression[MAX_STACK_SIZE];
char word[100];
//μ€μ νμμ μ
λ ₯
printf("μ€ν κ²°κ³Ό\n");
printf("μμμ μ
λ ₯νμΈμ : ");
scanf("%s", expression);
//μ€μ νκΈ°μ λ° κ²°κ³Ό κ° νμ
element *result = infix_to_postfix(expression);
if (err == -1) {
printf("νμμ : %s\n", result);
printf("κ³μ°κ²°κ³Ό : %d\n\n", eval(result));
}
return 0;
}
π3. μ€ν κ²°κ³Ό

β¨4. λλμ &μ€λͺ
μ΄λ² ν΄μ¦μμλ μ€νμ μ΄μ©ν μ€μνκΈ°λ²μ νμ νκΈ°λ²μΌλ‘ λ³ννλ κ³μ°λ²μ΄λ κ·Έ κ²°κ³Ό κ°μ μΆλ ₯νλ νλ‘κ·Έλ¨μ λ§λλ νλμ νμλ€. λ¨Όμ μ΄λ² νλ‘κ·Έλ¨μ ꡬννκΈ° μν΄μλ κΈ°λ³Έμ μΈ μ€νμ λμ ν λΉκ³Ό μ€ν ν¨μμ λν μλ²½ν μμ§κ° νμνμΌλ©°, μ΄ λ¬Έμ μ νΉμ§μΌλ‘, μ€μ νκΈ°λ²μ νμ νκΈ°λ²μΌλ‘ λ³ννλ λ²λ²κ³Ό νμ νκΈ°λ² κ³μ°λ°©λ²κ³Ό μ΄λ₯Ό ꡬννκΈ° μν μ μ°¨λ₯Ό μκ°νλ κ²μ΄ κ°μ₯ μ€μνλ€. λ¨Όμ μ€μ νκΈ°λ²μ νμ νκΈ°λ²μΌλ‘ λ³ννλ μ μ°¨λ κ°λ¨νκ² νΌμ°μ¬μκ° λ€μ΄μ€λ©΄ λ°λ‘ μΆλ ₯νκ³ μ°μ°μκ° λ€μ΄μ€λ©΄ μκΈ°λ³΄λ€ μ°μ μμκ° λκ±°λ κ°μκ²λ€μ λΉΌκ³ μμ μ μ€νμ λ΄μ λ€ β(βλ₯Ό λ§λλ©΄ 무쑰건 μ€νμ λ΄κ³ , λ«λ κ΄νΈ β)λ₯Ό λ§λλ©΄ β(βλ₯Ό λ§λ λ κΉμ§ μ€νμμ μΆλ ₯νλ κ²μΌλ‘ μ΄λ¬ν μ μ°¨λ₯Ό ν΅ν΄ μ€νμ μλ μ°μ°μ μ°μ μμλ₯Ό μ΄μ©νλ©΄ μ€μ νκΈ°λ²μ νμ νκΈ°λ²μΌλ‘ λ³ν ν μ μκ² λ€κ³ μκ°νμλ€. κ·Έλ¦¬κ³ νμ νκΈ°λ² κ³μ°μ νΌμ°μ°μλ₯Ό λ§λλ©΄ μ€νμ λ΄κ³ μ°μ°μλ₯Ό λ§λλ©΄ μ€νμμ λ κ°μ μ°μ°μλ₯Ό κΊΌλ΄μ μ°μ°ν λ€ κ·Έ κ²°κ³Όλ₯Ό μ€νμ λ΄μ μ°μ°μ λ§μΉκ³ μ€νμ λ¨μμλ νλμ νΌμ°μ°μκ° μ°μ° μνμ κ²°κ³Όκ° λλ©΄ νμ νκΈ°λ² κ³μ°μ μλ£νλ μ μ°¨λ₯Ό ν΅ν΄ μ½λλ₯Ό κ΅¬μ± ν μμκ² λμλ€. μ΄λ κ² νμ νκΈ°λ² κ³μ°μ΄λ μ€μ νκΈ°λ²μ νμ νκΈ°λ²μΌλ‘ λ³ννλ μ½λλ₯Ό ν΄μ¦λ₯Ό νλλ μκ°λ΄ μ€μ€λ‘ νμ§λ λͺ» νμμ§λ§, ν΄μ¦κ° λλ ν νμ νκΈ°λ²κ³Ό λ³ννλ μ μ°¨λ₯Ό μ²μ²ν μ΄ν΄λ³΄κ³ μ΄ν΄νλ©΄μ λ§μ μκ°μ ν¬μνμ¬ νλ‘κ·Έλ¨μ ꡬν ν μ μμλ€. μ΄λ² ν΄μ¦λ₯Ό ν΅ν΄ μ€μ€λ‘ μ€νμ μλ²½νκ² κ΅¬ννκΈ° μν΄ μ€νμ μ΄μ©ν λ€μν μμ λ¬Έμ λ₯Ό μ½λ©μ¬μ΄νΈμμμ μ°Ύμλ³΄κ³ μ€νμ λν μ΄ν΄λ₯Ό λ λμ¬ μ€νμ μ€μ€λ‘ μλ²½νκ² κ΅¬νν΄μΌκ² λ€κ³ μκ°νλ κ³κΈ°κ° λμκ³ ,μμΌλ‘ ν΄μ¦λ₯Ό νκ³ ν΄μ¦μ μ°κ΄λ λ¬Έμ λ₯Ό λ§μ΄ νμ΄λ΄μΌκ² λ€λ μκ°λ λ€μλ€.