본문 바로가기
DSA

스택(Stack) 활용 예제 2

by KWONE 2024. 8. 21.

후위 표기 수식 계산


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

#define MAX_STACK_SIZE 100

typedef char element;
typedef struct {
	element data[MAX_STACK_SIZE];
	int top;
}StackType;

void init(StackType* s) {
	s->top = -1;
}
int is_full(StackType* s) {
	return (s->top == MAX_STACK_SIZE - 1);
}
int is_empty(StackType* s) {
	return (s->top == -1);
}
void push(StackType* s, element item) {
	if (is_full(s)) {
		fprintf(stderr, "스택 포화 에러");
		return;
	}
	else s->data[++(s->top)] = item;;
}
element pop(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "스택 공백 에러");
		exit(1);
	}
	else return s->data[(s->top)--];
}
element peek(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "스택 공백 에러");
		exit(1);
	}
	else return s->data[(s->top)];
}

 

2024.07.22 - [Algorithm] - 스택 (stack)

 

스택 (stack)

스택은 후입선출의 입출력형태를 나타낸다. (Last-in, First-out)ADT 추상 자료형으로 스택을 나타내면 다음과 같다.객체: 0개 이상의 원소를 가지는 유한 선형 리스트연산:create(size) ::= 최대 크기가 siz

kwone.tistory.com

 


 

int eval(char exp[])
{
	int op1, op2,value,i=0;
	char ch;
	int len = strlen(exp);
	StackType s;
	init(&s);
	for ( i = 0; i < len; i++) {
		ch = exp[i];
		if (ch != '+' && ch != '-' && ch != '/' && ch != '*') {
			value = ch - '0'; //ch가 피연산자인 경우
			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 main() {
	int result;
	printf("후위표기식은 82/3-32*+\n");
	result = eval("82/3-32*+");
	printf("결과값은 %d\n", result);
	return 0;
}

'DSA' 카테고리의 다른 글

큐(Queue) 2  (0) 2024.08.22
스택(Stack) 활용 예제 3  (0) 2024.08.21
스택(Stack) 활용 예제 1  (0) 2024.08.21
스택(Stack) 2  (0) 2024.08.19
순환 (하노이 탑)  (0) 2024.07.28