C언어로 쉽게 풀어쓴 자료구조 연습문제 4-13

임승혁·2021년 2월 3일
0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
typedef char element; // 후위 표기식 계산, 괄호 검사 프로그램 실행 시 int -> char로 바꿔준다.
typedef struct {
	element data[MAX_STACK_SIZE];
	int top;
}StackType;
int top = -1;

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 checkMatching(const char* in) {
	StackType s;
	char ch, open_ch;
	int i, n = strlen(in);
	init_stack(&s);

	for (i = 0;i < n;i++) {
		ch = in[i];
		switch (ch) {
		case '(': case '[': case '{':
			push(&s, ch);
		case ')': case ']': case '}':
			if (is_empty(&s)) return 0;
			else {
				open_ch = pop(&s);
				if ((open_ch == '(' && ch != ')') ||
					(open_ch == '[' && ch != ']') ||
					(open_ch == '{' && ch != '}')) {
					return 0;
				}
				break;
			}
		}
	}
	if (!is_empty(&s)) return 0;
	return 1;
}
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 main(void) {
	printf("정수를 입력하시오. : ");
	char input[100];
	scanf_s("%s", input, sizeof(input));

	StackType s1, s2;
	init_stack(&s1);
	init_stack(&s2);

	int i = 0;
	while (input[i] != NULL) {
		if (input[i] != input[i + 1])
			push(&s1, input[i] - '0');
		i++;
	}
	while (!is_empty(&s1)) {
		push(&s2, pop(&s1));
	}
	printf("출력 : ");
	while (!is_empty(&s2)) {
		printf("%d", pop(&s2));
	}
	return 0;

}

프로그램 설명: 스택을 이용해서 연속해서 나온 숫자가 중복이 되지 않도록 하는 프로그램.

profile
한성공대생

0개의 댓글