#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;
}
프로그램 설명: 스택을 이용해서 연속해서 나온 숫자가 중복이 되지 않도록 하는 프로그램.